2008-10-24 2 views
1

У нас есть специализированный DAL, который находится над нашей БД. Наши приложения должны использовать этот DAL для правильной работы с этой БД.Как архитектор DAL для воздействия WebService?

Сгенерированный 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 

Это работает, потому что конструктор класса устанавливает все NULLproperties Истины и настройка любого FieldProperty заставит эквивалент NullProperty быть установлены в ложь.

Мне недавно пришлось подвергать DAL через Интернет через веб-сервис (который я, конечно же, намерен обеспечить), и обнаружил, что, хотя структура класса «Rec» остается неповрежденной в Интернете. . Вся логика потеряна.

Если кто-то отдал предыдущий фрагмент кода удаленно, они заметили бы, что ни одно из условий не будет истинным, так как не существует кода на стороне клиента, который устанавливает null в true.

У меня такое чувство, что я все это неправильно задумал, но не могу понять, как я должен его улучшить.

Каков правильный способ его создания?

ответ

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

Веб-службы предназначены для предоставления операций (методов) & данных, но не внутренней логики реализации. Это «хорошая вещь» в мире сервис-ориентированной архитектуры. Сценарий, который вы описываете, представляет собой архитектуру удаленного/распределенного объекта. Веб-службы не будут поддерживать то, что вы пытаетесь сделать. См. Это post для получения дополнительной информации.