2008-12-04 95 views
8

我想知道如何告訴NHibernate解決依賴我的POCO域對象。依賴注入與NHibernate對象

我發現像CalculateOrderTax這樣的方法應該在Domain對象中,因爲它們編碼了特定於域的業務規則。但是一旦我有兩個我違反了SRP。

將這些方法提取到Strategy類是沒問題的,但我想知道如何讓NHibernate加載這些方法。

它似乎不是一個好的解決方案,通過循環庫中的對象列表來執行基於get/set的Dependecy注入,然後將對象移交給更高層。

我現在也在爲我的Depency注射劑使用Castle Windsor。

回答

8

我一直在使用攔截器類似的任務:

修飾加載實體攔截器:

public class MyInterceptor : EmptyInterceptor 
{ 
    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
     return InjectDependencies(entity as MyEntity); 
    } 
} 

與會話關聯的:

nhSessionFactory.OpenSession(myInterceptor); 

我也看到了在即將到來的2.1版本中會有更好的支持自定義構造函數注入的地方,但我似乎無法找到現在的參考。

1

由於目前似乎沒有人能夠回答您的問題,因此我認爲我會建議您重新構建您的代碼,以免除訂單需要計算它自己的稅款。

您可以將它委託給一個OrderTaxService,它接收一個Order對象並返回一個OrderValue對象或沿着這些行的東西。

這將保留您的域中的邏輯,但不需要將它附加到您的Order對象。

+0

這就是我現在要做的。我一直傳遞命令,讓外部類來計算東西。它只是感覺不對,因爲我的對象是a)可變的,b)我需要隨身攜帶這些服務,因爲如果我不想從業務邏輯代碼中提出這些服務的話。 – Tigraine 2008-12-04 15:08:39

+0

當一件事情有多種策略時,它會變得更加棘手。與正常稅率的訂單一樣,其計算方式與其他方式不同。然後,我必須讓服務部門決定如何計算給定域對象的稅收。 .. – Tigraine 2008-12-04 15:09:43

1

我同意Garry的看法,您應該儘可能地從您的域對象中刪除服務依賴項。有時候它是有道理的,比如加密/解密。在這種情況下,您可以使用攔截或IUserType將其隱藏在基礎結構中。我認爲後者是有利的,當你可以使用它。 This article詳細顯示瞭如何做到這一點。我正在做這個,它工作得很好。