Как спроектировать DAL для экспозиции WebService?

У нас есть узкоспециализированный DAL, который находится над нашей БД. Нашим приложениям необходимо использовать этот DAL для правильной работы с этой БД.

Сгенерированный DAL (который находится в некоторых пользовательских базовых классах) имеет различные классы Rec (Table1Rec, Table2Rec), каждый из которых представляет структуру записи данной таблицы.

Вот образец псевдокласса ...

Public Class SomeTableRec
    Private mField1 As String
    Private mField1isNull As Boolean
    Private mField2 As Integer
    Private mField2isNull As Boolean

    Public Sub New()
        mField1isNull = True
        mField2isNull = True
    End Sub
    Public Property Field1() As String
        Get
            Return mField1
        End Get
        Set(ByVal value As String)
            mField1 = value
            mField1isNull = False
        End Set
    End Property
    Public ReadOnly Property Field1isNull() As Boolean
        Get
            Return mField1isNull
        End Get
    End Property
    Public Property Field2() As Integer
        Get
            Return mField2
        End Get
        Set(ByVal value As Integer)
            mField2 = value
            mField2isNull = False
        End Set
    End Property
    Public ReadOnly Property Field2isNull() As Boolean
        Get
            Return mField2isNull
        End Get
    End Property
End Class

У каждого класса есть свойства для каждого из полей ... Таким образом, я могу написать ...

Dim Rec as New Table1Rec
Table1Rec.Field1 = "SomeString"
Table2Rec.Field2 = 500

Если поле может принимать значение NULL, существует дополнительное свойство, которое указывает, является ли значение в настоящее время нулевым.

Таким образом....

Dim Rec as New Table1Rec
Table1Rec.Field1 = "SomeString"
If Table1Rec.Field1Null then 
    ' This clearly is not true
End If
If Table1Rec.Field2Null then 
    ' This will be true
End If

Это работает, потому что конструктор класса устанавливает для всех свойств NULL значение True, а установка любого свойства FieldProperty приведет к установке эквивалентного свойства NullProperty в значение false.

Недавно у меня возникла необходимость предоставить доступ к моему DAL через Интернет через веб-службу (которую я, конечно, намерен защитить), и я обнаружил, что, хотя структура класса Rec остается нетронутой в сети ... Вся логика остается неизменной. потерял..

Если бы кто-то запускал предыдущий фрагмент кода удаленно, он бы заметил, что ни одно из условий не подтвердится, поскольку нет кода на стороне клиента, который устанавливает значение null в true.

Мне кажется, что я все это неправильно спроектировал, но не вижу, как мне это улучшить.

Как правильно это спроектировать?


person Rory Becker    schedule 24.10.2008    source источник


Ответы (2)


Не уверен, что я полностью понимаю вопрос, но вы можете иметь типы данных, допускающие значение NULL, в XML.

Итак, это ...

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Testing
     Inherits System.Web.Services.WebService

    <WebMethod()> _
   Public Function GetObjects() As Generic.List(Of TestObject)
        Dim list As New Generic.List(Of TestObject)
        list.Add(New TestObject(Nothing, "Empty ID Object"))
        list.Add(New TestObject(1, "Full ID Object"))
        list.Add(New TestObject(2, Nothing))
        Return list
    End Function

    Public Class TestObject
        Public Sub New()
            _name = String.Empty
            _id = Nothing
        End Sub
        Public Sub New(ByVal id As Nullable(Of Integer), ByVal name As String)
            _name = name
            _id = id
        End Sub
        Private _name As String
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property

        Private _id As Nullable(Of Integer)
        Public Property ID() As Nullable(Of Integer)
            Get
                Return _id
            End Get
            Set(ByVal value As Nullable(Of Integer))
                _id = value
            End Set
        End Property
    End Class

End Class

выводит это (с областями, допускающими значение NULL)

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfTestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
 <TestObject>
  <Name>Empty ID Object</Name> 
  <ID xsi:nil="true" /> 
 </TestObject>
 <TestObject>
  <Name>Full ID Object</Name> 
  <ID>1</ID> 
 </TestObject>
 <TestObject>
  <ID>2</ID> 
 </TestObject>
</ArrayOfTestObject>
person digiguru    schedule 05.03.2009

Веб-службы предназначены для раскрытия операций (методов) и контрактов данных, но не для внутренней логики реализации. Это «хорошо» в мире сервис-ориентированной архитектуры. Описываемый вами сценарий представляет собой архитектуру удаленных / распределенных объектов. Веб-службы не будут поддерживать то, что вы пытаетесь сделать. Дополнительную информацию см. В этом сообщении для получения дополнительной информации.

person Sixto Saez    schedule 24.10.2008