2009-12-12 62 views
3

我是DDD的新手,所以請原諒我,如果我沒有正確使用這些條款。域名驅動設計問題

我使用C#MS/SQL和NHibernate。

我有一個班級電話付款,這個付款有一個PaymentCurrency,這些都是數據庫中的一個實體。

好的。在我的域模型我希望能夠創建付款爲要麼

Payment p = new Payment(100) // automatically uses the default currency (defined in the db) 

Payment p = new Payment(100, Repository.GetCurrency("JPY")) // uses Yen defined in the db. 

但在我看來,爲了初始化我的域對象與dfault貨幣,我需要污染具有持久性知識的領域模型。即在我可以完成默認付款構造函數之前,我需要從數據庫中加載默認付款對象。

我想象的構造是服用點像

public Payment(int amount) { 
    Currency = Repository.LoadDefaultCurrency(); // of cource defualt currency would be a singleton 
} 

public Payment(int amount, Currency c) { 
    Currency = c; // this is OK since c is passed in from outside the domain model. 
} 

謝謝你的建議。

回答

2

我不認爲有一個完美的解決方案,但你可以避免將持久性代碼放入域類中,方法是將默認貨幣(和類似的屬性)存儲在其他類中(例如「DomainDefaults」),並讓它從另一段代碼l初始化ogically坐落在域對象的「上方」。當然,你必須確保在創建任何域對象之前調用初始化代碼。如果沒有初始化,它可能會拋出一個異常,所以你至少可以很容易地理解它。

所以構造變得

public Payment(int amount) 
{ 
    Currency = DomainDefaults.DefaultCurrency; 
} 

而且你的地方NHibernate的初始化後不久,你會打電話:

DomainDefaults.DefaultCurrency = Repository.GetCurrency("JPY") 
0

您的答案將是依賴注入

利用它,不要用配置來監控模型。 如果您需要創建所需的金額和幣種付款 - 只要做到這些:

var currency = injectedCurrencyRepository.GetByName("JPY"); 
var p = new Payment(100.00m, currency); 

不要假設默認貨幣。

或在最壞的情況結束時,你可以添加inteface:

public interface ICurrencyProvider { 
    Currency GetCurrency(); 
} 
// Implment the default: 
public class DefaultCurrencyProvider : ICurrencyProvider { 
    public Currency GetCurrency() { 
     return new Currency("AUD"); 
    } 
} 

// And the Payment constructor will look like: 
public Payment(decimal amount, ICurrencyProvider currencyProvider) { 
    c = currencyProvider.GetCurrency(); 
} 

所以你可以注入(使用任何Windsot,統一或)該貨幣提供商默認進入方法你實例付款方式:

var p = new Payment(100.00m, defaultCurrencyProvider); 
+0

-1 from me - 我相信還有另一種獲取貨幣信息的方法,而不必訴諸於持久性或依賴注入。 – duffymo 2009-12-12 14:07:57

2

我不明白爲什麼這必須擁有的任何東西做與持久性所有。

如果我是用Java編寫的,我會從應用程序的語言環境中獲取默認貨幣。

This SO question告訴我CultureInfo是C#的等價物。也許你應該在你的設計中嘗試一下,留下像「日元」這樣的字符串,並堅持不懈。

+0

對於貨幣來說,這是一個好主意,但它並不能真正解決基本問題。你真正所做的就是將持久性從數據庫轉移到操作系統註冊庫。因此,如果例如你轉移到Unix,區域存儲會有所不同,因此我需要更改我的域模型... – thrag 2009-12-13 05:39:40

+0

10轉到Unix?我會假設你正在考慮Mono。我對Java更熟悉,所以我假設 - 也許不正確 - 如果我正在編寫Web應用程序,Locale/Culture將會從客戶端瀏覽器設置的HTTP標頭中獲得。 – duffymo 2009-12-13 11:52:01