Question

Nous avons un DAL hautement spécialisé qui repose sur notre base de données. Nos applications doivent utiliser ce DAL pour fonctionner correctement avec cette base de données.

Le DAL généré (qui repose sur certaines classes de base personnalisées) a diverses classes 'Rec' (Table1Rec, Table2Rec), chacune représentant la structure d'enregistrement d'une table donnée.

Voici un exemple de 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

Chaque classe a des propriétés pour chacun des champs ... Ainsi je peux écrire ...

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

Lorsqu'un champ peut accepter une valeur NULL, il existe une propriété supplémentaire qui indique si la valeur est actuellement nulle.

Ainsi ....

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

Cela fonctionne parce que le constructeur de la classe définit toutes les propriétés NULL sur True et que la définition de toute propriété FieldProperty entraîne la définition de la propriété NullProperty équivalente sur false.

J'ai eu récemment le besoin d'exposer ma DAL sur le Web par le biais d'un service Web (que je compte bien sûr sécuriser) et j'ai découvert que, même si la structure de la classe 'Rec' reste intacte sur le Web ... Toute logique est perdue.

Si quelqu'un devait exécuter à distance le code précédent, il remarquerait qu'aucune de ces conditions ne serait vérifiée, car il n'y a pas de code côté client qui attribue la valeur null à true.

J'ai l'impression que j'ai tout faux, mais je ne vois pas comment l'améliorer.

Quel est le bon moyen d'architecter cela?

Était-ce utile?

La solution

Je ne suis pas sûr de bien comprendre la question, mais vous pouvez avoir des types de données nullables en XML.

Alors ça ...

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

renvoie ceci (avec des zones nullables)

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

Autres conseils

Les services Web sont conçus pour exposer les opérations (méthodes) & amp; contrats de données, mais pas la logique de mise en œuvre interne. C’est une "bonne chose" dans le monde de l'architecture orientée services. Le scénario que vous décrivez est une architecture d'objet distant / distribué. Les services Web ne prendront pas en charge ce que vous essayez de faire. Veuillez consulter cet post pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top