Pregunta

Tenemos un DAL altamente especializado que se encuentra sobre nuestra base de datos. Nuestras aplicaciones necesitan usar este DAL para operar correctamente contra este DB.

El DAL generado (que se encuentra en algunas clases base personalizadas) tiene varias clases 'Rec' (Table1Rec, Table2Rec), cada una de las cuales representa la estructura de registro de una tabla determinada.

Aquí hay una pseudoclase de muestra ...

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 clase tiene propiedades para cada uno de los campos ... Así puedo escribir ...

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

Cuando un campo puede aceptar un valor NULO, hay una propiedad adicional que indica si el valor es actualmente nulo.

Por lo tanto ....

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

Esto funciona porque el constructor de la clase establece todas las propiedades NULL en True y la configuración de cualquier FieldProperty hará que la NullProperty equivalente se establezca en false.

Recientemente tuve la necesidad de exponer mi DAL a través de la web a través de un servicio web (que, por supuesto, tengo la intención de asegurar) y he descubierto que, aunque la estructura de la clase 'Rec' permanece intacta en la web ... Toda la lógica se pierde ...

Si alguien ejecutara el código anterior de forma remota, se daría cuenta de que ninguna de las dos condiciones sería verdadera, ya que no hay un código del lado del cliente que establezca nulo en verdadero.

Tengo la sensación de que lo he archivado todo mal, pero no veo cómo debería mejorarlo.

¿Cuál es la forma correcta de diseñar esto?

¿Fue útil?

Solución

No estoy seguro de si entiendo completamente la pregunta, pero puede tener tipos de datos que admiten nulos en XML.

Entonces esto ...

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

produce esto (con áreas que admiten nulos)

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

Otros consejos

Los servicios web están diseñados para exponer la operación (métodos) & amp; contratos de datos pero no lógica de implementación interna. Esto es una "cosa buena" en el mundo de la arquitectura orientada a servicios. El escenario que describe es una arquitectura de objetos remotos / distribuidos. Los servicios web no respaldarán lo que está intentando hacer. Consulte esta post para obtener más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top