DDD和配置

时间:2013-07-01 01:38:01

标签: domain-driven-design repository-pattern

如何在DDD中授予用户配置设置的访问权限?

我们有一个配置数据库,它将项目存储为一堆键值对。这似乎不适合存储库模式,因此如何让用户访问这些配置值?

理想情况下,我希望为不同的配置分组设置单独的类,即.. BillingSettings,ReportSettings,TaxSettings。

为这些设置提供单独的存储库似乎很奇怪,但我也希望保持这些设置类的持久性无知。

在DDD中启用配置访问的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我通常做的只是使用接口抽象配置,例如IBillingConfigurationIReportConfiguration等等。然后将这些实现传递到相关方法(或注入相关对象)。

价值来自那时真的不重要。有时我在将值存储在数据库中时使用存储库,然后我会使用IConfigurationPropertyRepository之类的东西。这有点尴尬,因为ConfiruationProperty并不像实体世界中的一流公民那样,但似乎确实完成了工作。

我会返回一些IBillingConfiguration的实现,它只从底层集合或ConfigurationProperty对象中获取所需的属性。

每个Get的相关SaveI{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) {...}
}