如何在DDD中訪問用戶配置的設置?DDD和配置
我們有一個配置數據庫,它將項目存儲爲一組鍵值對。這似乎不適合存儲庫模式,那麼如何使用戶能夠訪問這些配置值?
理想情況下,我想爲不同的配置分組分類,即.. BillingSettings,ReportSettings,TaxSettings。
爲每一個提供一個單獨的存儲庫似乎很奇怪,但我也想維護這些設置類的持久性無知。
在DDD中啓用訪問配置的正確方法是什麼?
如何在DDD中訪問用戶配置的設置?DDD和配置
我們有一個配置數據庫,它將項目存儲爲一組鍵值對。這似乎不適合存儲庫模式,那麼如何使用戶能夠訪問這些配置值?
理想情況下,我想爲不同的配置分組分類,即.. BillingSettings,ReportSettings,TaxSettings。
爲每一個提供一個單獨的存儲庫似乎很奇怪,但我也想維護這些設置類的持久性無知。
在DDD中啓用訪問配置的正確方法是什麼?
我通常所做的只是使用接口抽象配置,例如IBillingConfiguration
,IReportConfiguration
等。這些的實現然後被傳遞到相關方法(或注入到相關對象)中。
從哪裏來的值真的應該沒關係。有時候,當我在數據庫中存儲值時使用存儲庫,然後我有類似IConfigurationPropertyRepository
的東西。這是一種非常尷尬的做法,因爲ConfiruationProperty
不太像在實體世界中的一流公民,但它似乎確實完成了工作。
我將返回IBillingConfiguration
的一些實現,它只從基礎集合或ConfigurationProperty
對象獲取所需屬性。
相關Get
和Save
方法各I{Some}Configuration
將在ConfigurationPropertyRepository
來實現,這樣我只得到/保存需要應用的屬性的子集。
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) {...}
}
問題是,有很多特定於業務的配置值 - 給你舉一個例子,說明業務術語「到期」和系統可配置的值如何。在幾天內?到期檢查應該是域的一部分,但爲此,您還需要獲取配置值。 –
我同意:)。我更願意將其視爲一個領域概念。在你的例子中,我會有一個OrderExpirationSpecification,它可以被域服務返回。在這個有界的背景下,它是一個抽象。如何獲得這些日子是一個基礎設施問題。此外,可能需要管理員應該有能力在運行時更改日期,但我認爲CRUD操作應該被拆分爲另一個有界的上下文。 – Hippoom
好吧..我只看到一個實施問題在這裏使用例如。 Spring或JEE平臺..任何提示你如何處理這個問題? –