【问题标题】:How to architect DAL for WebService exposure?如何为 WebService 暴露构建 DAL?
【发布时间】:2008-10-24 15:48:01
【问题描述】:

我们有一个高度专业化的 DAL,它位于我们的数据库之上。我们的应用需要使用此 DAL 才能正确操作此 DB。

生成的 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 值,则有一个附加属性指示该值当前是否为 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。

我觉得我的架构错了,但不知道我应该如何改进它。

构建这个的正确方法是什么?

【问题讨论】:

    标签: web-services data-access-layer dto null


    【解决方案1】:

    不确定我是否完全理解这个问题,但您可以在 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
    

    输出这个(带有可为空的区域)

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

    【讨论】:

      【解决方案2】:

      Web 服务旨在公开操作(方法)和数据契约,但不公开内部实现逻辑。这在面向服务的架构世界中是一件“好事”。您描述的场景是远程/分布式对象架构。 Web 服务将不支持您尝试执行的操作。请参阅此post 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多