Pergunta

Temos uma DAL altamente especializada, que fica sobre o nosso DB. Nossos aplicativos precisam usar esta DAL para operar corretamente contra este DB.

A DAL gerado (que fica em algumas classes de base costume) tem várias classes 'Rec' (Table1Rec, Table2Rec) cada uma das quais representa a estrutura do registo de uma determinada mesa.

Aqui está um exemplo Pseudo-classe ...

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

Cada classe tem propriedades para cada um dos campos ... Assim eu posso escrever ...

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

Quando um campo pode aceitar um valor NULL, há uma propriedade adicional que indica se o valor é actualmente nulo.

Assim ....

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

Isso funciona porque o construtor da classe define todas NULLproperties como true e a definição de qualquer FieldProperty fará com que o NullProperty equivalente a ser definida como falsa.

Eu tive recentemente a necessidade de expor o meu DAL através da web através de um serviço web (que eu, claro, a intenção de seguro) e descobriram que, enquanto a estrutura da classe do 'Rec' permanece intacta através da web ... toda a lógica é perdida ..

Se alguém executar a peça de código anterior remotamente eles iriam perceber que nem condição provaria verdadeiro como não há nenhum código do lado do cliente que define nula a verdade.

Tenho a sensação que tenho arquitetado tudo errado, mas não pode ver como devo melhorá-lo.

O que é a maneira correta de arquiteto isso?

Foi útil?

Solução

Não tenho certeza se eu entender completamente a questão, mas você pode ter tipos de dados anuláveis ??em XML.

Portanto, este ...

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

gera este (com áreas anuláveis)

<?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>

Outras dicas

Os serviços Web são projetados para expor operação (métodos) e contratos de dados, mas lógica de implementação não interno. Esta é uma "coisa boa" no mundo da arquitetura orientada a serviços. O cenário que você descreve é ??um / Arquitectura objeto remoto distribuído. serviços da Web não irá apoiar o que você está tentando fazer. Consulte este pós para obter mais informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top