域服务中的基础架构问题

时间:2014-04-30 08:28:33

标签: database domain-driven-design

我有一个域服务需要应用一些影响基础架构层的规则,因为它们是域要求。简而言之:基础设施政策和策略。

public MyService : IMyService {

    private readonly RetryPolicy<ConnectionErrorDetectionStrategy> _retryPolicy;
    // there might be other strategies for other concerns
    private readonly IRepository _repository;

    public MyService(IRepository repository) {
        _repository  = repository;
        _retryPolicy = new RetryPolicy<ConnectionErrorDetectionStrategy>();
    }

    public Do() {

        _repository.CrudMagic();
        _retryPolicy.ExecuteAction(() => _repository.Commit());

    }

}

要求是确保在某些情况下( case ),当应用程序无法连接时,软件应进行多次重试(策略)(策略)到数据库。然而,这感觉很难,因为域名并不知道连接是什么(整个DAL甚至可能是模拟!)。如何确保针对此特定服务/案例应用正确的策略?

1 个答案:

答案 0 :(得分:0)

使用代理或装饰。

class MyService : IMyService {...}
class MyRetryService: IMSyService {
    private readonly IMSyService target; //inject MyService
    private readonly RetryPolicy<ConnectionErrorDetectionStrategy> _retryPolicy;
}

单元测试时将mock注释为目标(IMSyService)。只是期望并验证目标的调用。如果失败,并且重试有效,则应该根据指定的策略调用目标。

另一种选择是AOP(如果您的平台上有成熟的框架/ lib)。测试方法是一样的。