2008-10-24 2 views
1

우리는 우리의 DB에 앉는 고도로 전문화 된 DAL을 가지고 있습니다. 우리의 앱은이 DB에 대해 올바르게 작동하려면이 DAL을 사용해야합니다.WebService 노출을 위해 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 

클래스의 생성자가 True로 모든 NULLproperties을 설정하고 FieldProperty의 설정은 해당 NullProperty false로 설정되는 원인이 있기 때문에이 작동합니다.

웹 서비스를 통해 웹을 통해 내 DAL을 노출 할 필요가 있었으며 (물론 나는 보안을 유지하려고합니다) 'Rec'클래스의 구조가 웹에서 손상되지 않은 채로 있음을 발견했습니다. 모든 논리가 손실됩니다 ..

누군가가 이전 코드를 원격으로 실행하면 null을 true로 설정하는 클라이언트 측 코드가 없으므로 어느 조건도 사실이 아님을 알 수 있습니다.

나는이 모든 잘못을 건축 한 느낌이 들지만, 어떻게 개선해야하는지 알 수 없습니다.

올바른 설계 방법은 무엇입니까?

답변

1

질문을 완전히 이해했는지는 확실하지 않지만 XML에 nullable 데이터 형식을 포함 할 수는 있습니다.

그래서 ...

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을 참조하십시오.

관련 문제