我有10个POCO课程。 我正在使用一个简单的存储库模式,其工作单元具有IRespoitory接口和UnitOf工作类。
是否正确(正常)将我的所有IRepository放在一个UnitOfWork实例中?
即: 10 POCO类 - 10个IRepository实例 - 只有一个UnitOfWork类,它包含所有10个存储库
UnitOfWork
{
IRepository<Customer> CustomerRepository {get; set;}
IRepository<Customer> CustomerRepository {get; set;}
IRepository<Customer> CustomerRepository {get; set;}
// the same for all others 7 POCo class
// ..other stff
}
答案 0 :(得分:0)
有点像 EF DataContext 。
EntityFramework的DataContext 是工作单元,有点像存储库(或存储库的集合 >)。
我更喜欢将这些内容分开并使用依赖注入框架(如结构图)。
您可以向{strong 1}}询问 structuremap ,它会为您提供实例。
将 UoW 与存储库分开。
您可以拥有一个 UoW 类(使用类似:IRepository<Customer>
的方法),然后使用存储库(每个类型都使用以下方法:SubmitChanges
)
答案 1 :(得分:0)
是的,您的方法是正确的(正常),一个工作单元类/实例包含所有(POCO类的)存储库。
UoW给我带来2个重要的事情/优点;
一个显而易见的例子是ACID(原子,一致性,隔离性,持久性)事务,因为只有一个dbcontext跟踪并更新了所有数据库更改。
这是在存储库中使用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();