如何在DDD中授予用户配置设置的访问权限?
我们有一个配置数据库,它将项目存储为一堆键值对。这似乎不适合存储库模式,因此如何让用户访问这些配置值?
理想情况下,我希望为不同的配置分组设置单独的类,即.. BillingSettings,ReportSettings,TaxSettings。
为这些设置提供单独的存储库似乎很奇怪,但我也希望保持这些设置类的持久性无知。
在DDD中启用配置访问的正确方法是什么?
答案 0 :(得分:1)
我通常做的只是使用接口抽象配置,例如IBillingConfiguration
,IReportConfiguration
等等。然后将这些实现传递到相关方法(或注入相关对象)。
价值来自那时真的不重要。有时我在将值存储在数据库中时使用存储库,然后我会使用IConfigurationPropertyRepository
之类的东西。这有点尴尬,因为ConfiruationProperty
并不像实体世界中的一流公民那样,但似乎确实完成了工作。
我会返回一些IBillingConfiguration
的实现,它只从底层集合或ConfigurationProperty
对象中获取所需的属性。
每个Get
的相关Save
和I{Some}Configuration
方法将在ConfigurationPropertyRepository
上实施,以便我只获取/保存需要的属性的子集应用
答案 1 :(得分:0)
BillingSettings真的是您的域模型中的聚合(甚至是域对象)吗?如果没有,它不应该有相应的存储库。
大多数配置都是特定于基础架构的,例如jdbc url,password等。你不必以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) {...}
}