2008-10-11 39 views
0

我使用JCProperty類中的以下代碼來檢索從DAL數據:在業務層和數據訪問層之間傳遞數據 - 糟糕的代碼?

Dim x As JCProperty 
     x = JCPropertyDB.GetProperty(PropertyID) 

     If Not x Is Nothing Then 
      Me.PropertyID = x.PropertyID 
      Me.AddressLine1 = x.AddressLine1 
      Me.AddressLine2 = x.AddressLine2 
      Me.AddressLine3 = x.AddressLine3 
      Me.AddressCity = x.AddressCity 
      Me.AddressCounty = x.AddressCounty 
      Me.AddressPostcode = x.AddressPostcode 
      Me.TelNo = x.TelNo 
      Me.UpdatedOn = x.UpdatedOn 
      Me.CreatedOn = x.CreatedOn 
      Me.Description = x.Description 
      Me.GUID = x.GUID 
     End If 

這工作得很好,但需要的是DAL對象(JCPropertyDB)知道業務對象(JCProperty)和我的有效地創建並填充兩次相同的對象(一次在DAL中返回BL,然後在BL對象內再次填充)。

我在這裏錯過了一些東西,我知道必須有更好的方法!

實際上,我需要指定'Me = x',這是不允許的。有人能讓我挺直嗎?

回答

1

我個人很懶。我通常是這樣的:

class JCProperty : inherits JCPropertyDB 
    { 

    New() 
     { 
     MyBase.New() 

     GetProperty(PropertyID) 

     } 
    } 

然後基本上已經大功告成,直到你有需要發生「上面」的JCPropertyDB已經存在的功能JCProperty類的一些附加功能。然後重寫JCPropertyDB方法以首先調用基本方法,然後添加新的功能。

羅恩

+0

正是我失蹤的!乾杯。 – Simon 2008-10-11 16:45:34

2

不確定這是否會回答您的問題,但重要的一點是,域模型獨立於顯示並獨立於存儲。這通常表示爲關注的分離。這個想法是獲得鬆散的耦合,並創建一個簡單的系統,其中對象沒有幾個完全不同的職責。
所以我會做的是允許DAL直接創建業務對象,但要確保我不會污染與DAL相關的任何業務對象。同樣,我不想用像HTML這樣的UI特定的東西來污染它們。 在我看來,業務層,DAL和UI層都具有對域模型的依賴關係,但從域模型和其他組件中獲得依賴關係並不好。
要鬆開耦合,使用Spring或任何其他依賴注入容器以及接口和接線都可以幫助您。
通過在每個圖層中重新創建相同的對象,您違反了DRY原則(不要重複自己),並且您正在引入鍋爐代碼並增加在某處引入錯誤的可能性。

4

你是在正確的路線上,但略微缺少一點。

通常情況下,您的數據訪問層(DAL)將從您的數據庫返回Data Transfer Objects(DTO)。這些是簡單的舊的CLR對象(PO​​CO),它們不包含業務邏輯,簡單地說屬性映射到數據庫表或多或少。

然後,您將有代碼從這些DTO創建Domain Model,稱爲Data Mapper。域模型中的類可能具有相似的名稱(即CustomerDTO - > Customer),但除數據外,它們將包含驗證規則以及可能的其他業務邏輯。

這就是您在業務層使用的這種領域模型,而不是實際的DTO。這意味着如果您更改從DAL返回的DTO(即通過實施新的ORM工具),則只需修改Data Mapper即可,只要數據模型保持不變即可。

我建議您查看Martin Fowler's Patterns of Enterprise Application Architecture以瞭解數據訪問模式。

0

我在多個BO一直走,並通過橋接模式和提供者模型從DAL發回不中。除非我害怕重序列化(比如Web服務或JSON),否則我無法看到DTO的要點。我的方法是通過一個接口抽象數據層和業務層,並提供一個匿名數據層饋入業務對象。這意味着我可以插入任何數據層,實現具有通用加載和保存方法的界面,然後通過我的域圖層訪問該界面。 BL中沒有DAL代碼 - 只需調用提供的和抽象的數據層即可。我對數據層調用由供應商管理模式(沒有直接提到),我只是做:

public class Person : IBusinessObject<Person> 
{ 
    protected IDataLayer<T> dataLayer; 

    Person Load() { this.dataLayer.Load(this); } 

} 
在數據層我有

...

public class PersonMapper : IDataLayer<Person> 
{ 
    Person Load(Person person) { 
    ...get DB stuff...map to person...decorate object... 
     return person; 
    } 
} 

我仍不很不知道這是否好,但它對我來說效果很好。我設法使用反射爲嵌套對象獲得延遲加載。

相關問題