2013-07-01 29 views
6

如何在DDD中訪問用戶配置的設置?DDD和配置

我們有一個配置數據庫,它將項目存儲爲一組鍵值對。這似乎不適合存儲庫模式,那麼如何使用戶能夠訪問這些配置值?

理想情況下,我想爲不同的配置分組分類,即.. BillingSettings,ReportSettings,TaxSettings。

爲每一個提供一個單獨的存儲庫似乎很奇怪,但我也想維護這些設置類的持久性無知。

在DDD中啓用訪問配置的正確方法是什麼?

回答

1

我通常所做的只是使用接口抽象配置,例如IBillingConfigurationIReportConfiguration等。這些的實現然後被傳遞到相關方法(或注入到相關對象)中。

從哪裏來的值真的應該沒關係。有時候,當我在數據庫中存儲值時使用存儲庫,然後我有類似IConfigurationPropertyRepository的東西。這是一種非常尷尬的做法,因爲ConfiruationProperty不太像在實體世界中的一流公民,但它似乎確實完成了工作。

我將返回IBillingConfiguration的一些實現,它只從基礎集合或ConfigurationProperty對象獲取所需屬性。

相關GetSave方法各I{Some}Configuration將在ConfigurationPropertyRepository來實現,這樣我只得到/保存需要應用的屬性的子集。

0

BillingSettings是否真的是您的域模型中的聚合(或甚至是域對象)?如果沒有,它不應該有一個相應的存儲庫。

大多數配置都是特定於基礎設施的,例如jdbc url,密碼等。你不必以DDD的方式處理它們。如果設置存儲在數據庫中並且允許在運行時由用戶修改,那麼我們可能需要ConfigurationService支持CRUD操作。但是ConfigurationService不屬於域和這個排序有界的上下文,它只是一個基礎設施服務。我們不必以DDD方式開發它。

@Kristof Jozsa的評論更新。

該設置用於支持域概念。域的概念是抽象的,如何訪問設置是一個實現細節。

class ExpirationSpecification { 
    private int days 
    //other settings?   

    public ExpirationSpecification(int days) {...} 

    public boolean isSatisfied(Order order) {...} 
} 

public class ExpirationServiceImpl implements ExpirationService { 
    //private int days;//inject using placeholder in spring 
    private ConfigurationService configService;//if settings are stored in database 

    ExpirationSpecification spec() { 
     //return new ExpirationSpecification(days); 
     return new ExpirationSpecification(configService.orderExpirationDays()); 
    } 

    void cancel(Order order) {...} 
} 
+1

問題是,有很多特定於業務的配置值 - 給你舉一個例子,說明業務術語「到期」和系統可配置的值如何。在幾天內?到期檢查應該是域的一部分,但爲此,您還需要獲取配置值。 –

+0

我同意:)。我更願意將其視爲一個領域概念。在你的例子中,我會有一個OrderExpirationSpecification,它可以被域服務返回。在這個有界的背景下,它是一個抽象。如何獲得這些日子是一個基礎設施問題。此外,可能需要管理員應該有能力在運行時更改日期,但我認爲CRUD操作應該被拆分爲另一個有界的上下文。 – Hippoom

+0

好吧..我只看到一個實施問題在這裏使用例如。 Spring或JEE平臺..任何提示你如何處理這個問題? –