如何授予对 DDD 中用户配置设置的访问权限?
我们有一个配置数据库,它将项目存储为一堆键值对。这似乎并不真正适合存储库模式,那么如何使用户能够访问这些配置值?
理想情况下,我希望为不同的配置分组设置单独的类,即.. BillingSettings、ReportSettings、TaxSettings。
为每一个都提供一个单独的存储库似乎很奇怪,但我也想保持对这些设置类的持久性无知。
在 DDD 中启用对配置的访问的正确方法是什么?
如何授予对 DDD 中用户配置设置的访问权限?
我们有一个配置数据库,它将项目存储为一堆键值对。这似乎并不真正适合存储库模式,那么如何使用户能够访问这些配置值?
理想情况下,我希望为不同的配置分组设置单独的类,即.. BillingSettings、ReportSettings、TaxSettings。
为每一个都提供一个单独的存储库似乎很奇怪,但我也想保持对这些设置类的持久性无知。
在 DDD 中启用对配置的访问的正确方法是什么?
我通常做的只是使用接口抽象配置,例如IBillingConfiguration
,IReportConfiguration
等。然后这些实现就是传递给相关方法(或注入相关对象)的内容。
价值观从何而来真的不重要。有时我在将值存储在数据库中时确实使用存储库,然后我会有类似IConfigurationPropertyRepository
. 这有点尴尬,因为 aConfiruationProperty
在 Entity 世界中并不像一等公民,但它似乎确实完成了工作。
我会返回一些 a 的实现,它只从底层集合或对象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) {...}
}