Como DAL arquiteto para a exposição WebService?
-
04-07-2019 - |
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?
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.