Webサービスを公開するためにDALを設計する方法は?
-
04-07-2019 - |
質問
DBの上にある高度に特化したDALがあります。このデータベースに対して正しく動作するには、アプリでこの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サービスを介してDALをWebサービスで公開する必要があり(もちろんこれを保護するつもりです)、「Rec」クラスの構造がWeb上でそのままであることがわかりました...すべてのロジックが失われます。
以前のコードをリモートで実行した場合、nullをtrueに設定するクライアント側コードがないため、どちらの条件も当てはまらないことに気付くでしょう。
私はこれをすべて間違っていると感じていますが、どのように改善すべきかわかりません。
これを設計する正しい方法は何ですか
解決
質問を完全に理解しているかどうかはわかりませんが、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
これを出力します(null許容領域を使用)
<?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>
他のヒント
Webサービスは、操作(メソッド)&amp;を公開するように設計されていますデータコントラクトは内部実装ロジックではありません。これは「良いこと」です。サービス指向アーキテクチャの世界で。説明するシナリオは、リモート/分散オブジェクトアーキテクチャです。 Webサービスは、あなたがやろうとしていることをサポートしません。詳細については、この投稿をご覧ください。