我知道类似的问题已经讨论过好几次了,但我猜我的问题略有不同。我正在试验基于域驱动设计的应用程序架构,使用存储库模式进行数据访问和实体框架基础架构。
我想要完成的是拥有可单元测试的系统,该系统也将具有工作单元的意识。
我喜欢系统中有核心服务来处理应用程序中所有业务逻辑的设计,即您有某种 CustomerService.AddOrder(int customerId, Order order) 而不是 ICustomerRepository.Find(int id)。 Orders.Add(订单订单)。使用这种方法,您可以使用更简单直观的界面。
(当然 CustomerService 依赖于 ICustomerRepository 并且可能也依赖于 IOrderRepository,但它会处理逻辑本身)。
但!这种方法的工作单元问题出现了:
我希望在核心服务中有可控的工作单元,即我需要能够启动一个新的工作单元,完成工作并处理它。
我想出的一种方法是:
public interface IUnitOfWork
{
ICustomerRepository CustomerRepository { get; set; }
IOrderRepository OrderRepository { get; set; }
}
public interface IUnitOfWorkFactory
{
void New(Action<IUnitOfWork> work); // this will let you create and then dispose a new instance of IUnitOfWork implementation
}
public class CustomerService
{
privateTUowFactory _uow { get; private set; }
public CustomerService(IUnitOfWorkFactory uowFactory)
{
_uow = uowFactory;
}
public void AddNewOrder(int id, string newName)
{
_uow.New(work =>
{
var customer = work.CustomerRepository.Find(id);
// Do some other required stuff
work.Commit();
});
}
}
之后,您只需为 IUnitOfWorkFactory、IUnitOfWork 和存储库创建实现;在客户端代码中,您只需要依赖 CustomerService,这很容易由 IOC 容器处理。
我喜欢这种方法,因为它有点紧凑、结构良好、逻辑组织和直观,但问题是我不知道如何正确地对服务进行单元测试(例如行为测试)。集成测试很容易,但目前我不关心它们。
任何想法将不胜感激。
非常感谢!