2013-07-25 91 views
2

在我的域模型中,我有一個名爲「Inventory」的實體。要在庫存中進行某種移動,我需要訪問業務級別配置以進行檢查。DDD - 將配置服務注入到實體中

我在庫存實體

public class Inventory 
{ 
    // Some codes, properties and arguments are omitted for brevity. 
    public int InventoryId { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual IList<InventoryTransaction> Transactions { get; set; } 
    public virtual IList<Stock> Stocks {get; set; } 
    // ........ 

    public void purchase(double qty, decimal cost) { //....... } 
    public double QuantitiesOnHand() { //..... } 
    public decimal CostOfItemsOnHand() { //....... } 

    // This method require to access certain configuration in order to 
    // process the sale of item. 
    public decimal Sell(double qty, decimal cost) { //..... } 
} 

下面的方法來處理我需要訪問某些配置的銷售。注入配置界面以處理該實體內的銷售是否是一種好的做法。它會損害DDD的純度嗎?或者我應該只將這個'Sell()'方法移動到域服務層?

編輯:

public virtual IList<Stock> Stocks {get; set; }加入以上的類定義持有股票的特定庫存項目。

+2

爲什麼不將配置值傳遞給銷售方法? –

+1

DomainService爲了簡單起見,或者在損害時重構它。 – Hippoom

+0

@DavinTryon,你是對的。但我有大約3到4個設置,我需要通過。我也懷疑將來它可能會增加。請告訴你的建議。 – BlueBird

回答

3

銷售/採購操作看起來不屬於這個實體。我的意思是,這些操作可能(可能更多)只是減少/增加數量。另外,他們的責任可能跨越多個實體。

這些方法很適合某種域服務。例如: -

public class InventoryTradeService 
{ 
    public void purchase(Inventory inventory, double quantity) 
    public void sell(Inventory inventory, double quantity) 
} 

關於你提到的「ConfigurationService」,如果是「企業級配置」就像你說的,應該是域模型的一部分。所以,沒有理由注入它 - 只需訪問它。如果它不是模型的一部分,請考慮將其合併。

+0

實際上,在我的設計中,庫存是一個負責處理單個產品庫存的實體。因此,單個產品的購買/銷售將在實體的IList <庫存交易>交易清單和IList 庫存清單中列出。在這種情況下,我認爲我們不需要爲此提供單獨的服務。建議。 – BlueBird

+1

我有點擔心'Inventory'作爲一個聚合根,包含'IList '可能會變得太大。任何想法,您計劃存儲多少交易和股票? – JefClaes

+0

@BlueBird你能否描述一下你的業務水平配置,裏面有什麼樣的東西? – gseric