Как спроектировать DAL для доступа к веб-сервисам?
-
04-07-2019 - |
Вопрос
У нас есть узкоспециализированный 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, существует дополнительное свойство, которое указывает, является ли значение в данный момент нулевым.
Таким образом....
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
Это работает, поскольку конструктор класса устанавливает для всех NULLproperty значение True, а установка любого FieldProperty приведет к тому, что эквивалентному NullProperty будет присвоено значение false.
Недавно у меня возникла необходимость предоставить доступ к моему DAL через Интернет через веб-службу (которую я, конечно же, намереваюсь защитить), и я обнаружил, что, хотя структура класса «Rec» остается неизменной через Интернет...Вся логика потеряна..
Если бы кто-то запустил предыдущий фрагмент кода удаленно, он бы заметил, что ни одно из условий не окажется истинным, поскольку не существует кода на стороне клиента, который устанавливает значение 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
выводит это (с обнуляемыми областями)
<?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>
Другие советы
Веб-сервисы предназначены для раскрытия операций (методов) и контрактов данных, но не внутренней логики реализации.Это «хорошая вещь» в мире сервис-ориентированной архитектуры.Описываемый вами сценарий представляет собой архитектуру удаленных/распределенных объектов.Веб-сервисы не будут поддерживать то, что вы пытаетесь сделать.Пожалуйста, посмотрите это почта Чтобы получить больше информации.