1

DB の上にある高度に専門化された DAL があります。アプリは、この DB に対して正しく動作するために、この DAL を使用する必要があります。

生成された 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 に設定されるためです。

私は最近、Web サービスを介して Web 経由で DAL を公開する必要がありました (もちろんこれはセキュリティで保護するつもりです)。「Rec」クラスの構造が Web 経由でそのまま残っていることを発見しました...すべてのロジックは失った..

誰かが前のコードをリモートで実行すると、null を true に設定するクライアント側のコードがないため、どちらの条件も true ではないことに気付くでしょう。

これをすべて間違って設計したような気がしますが、どのように改善すればよいかわかりません。

これを設計する正しい方法は何ですか?

4

2 に答える 2

1

質問を完全に理解しているかどうかはわかりませんが、XML で null 許容データ型を使用できます。

したがって、この...

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>
于 2009-03-05T12:50:39.003 に答える
0

Web サービスは、操作 (メソッド) とデータ コントラクトを公開するように設計されていますが、内部実装ロジックは公開していません。これは、サービス指向アーキテクチャーの世界では「良いこと」です。あなたが説明するシナリオは、リモート/分散オブジェクト アーキテクチャです。Web サービスは、あなたがしようとしていることをサポートしません。詳細については、この投稿を参照してください。

于 2008-10-24T16:18:17.130 に答える