我有一个域服务需要应用一些影响基础架构层的规则,因为它们是域要求。简而言之:基础设施政策和策略。
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甚至可能是模拟!)。如何确保针对此特定服务/案例应用正确的策略?
答案 0 :(得分:0)
使用代理或装饰。
class MyService : IMyService {...}
class MyRetryService: IMSyService {
private readonly IMSyService target; //inject MyService
private readonly RetryPolicy<ConnectionErrorDetectionStrategy> _retryPolicy;
}
单元测试时将mock注释为目标(IMSyService)。只是期望并验证目标的调用。如果失败,并且重试有效,则应该根据指定的策略调用目标。
另一种选择是AOP(如果您的平台上有成熟的框架/ lib)。测试方法是一样的。