是的,您的方法是正确的(正常),一个工作单元类/实例包含所有(POCO 类的)存储库。
UoW 为我带来了 2 个重要的事情/优势;
显而易见的一个是 ACID(原子、一致性、隔离、持久性)事务,因为只有一个 dbcontext 跟踪和更新所有 db 更改。
Unit of Work 减少了很多依赖注入。
这是将 UoW 与存储库一起使用的完整示例;
public interface IUnitOfWork
{
IRepository<Customer> Customers { get; }
IRepository<Order> Orders { get; }
// the same for all others 8 POCO class
Task<int> SaveAsync();
}
==================================================== ===========
public class UnitOfWork : IUnitOfWork
{
public IRepository<Customer> Customers { get; private set; }
public IRepository<Order> Orders { get; private set; }
// the same for all others 8 POCO class
private readonly MyDBContext _Context;
public UnitOfWork(MyDBContext context)
{
_dbContext = context;
Customers = new Repository<Customer>(_dbContext);
Orders = new Repository<Order>(_dbContext);
// the same for all others 8 POCO class
}
public async Task<int> SaveAsync()
{
return await _dbContext.SaveChangesAsync();
}
}
正如您在上面的实现中看到的那样,一个 dbContext 已用于生成所有存储库。这将带来 ACID 功能。
在您的服务/控制器(或您想要使用存储库的任何地方)中,您只需要注入 1 UoW 并且可以访问所有存储库:
_uow.Customers.Add(new Customer());
_uow.Ordres.Update(order);
_uow.SaveAsync();