我对UoW,Repository Pattern和EF的常见实现有一些疑问:
public interface IAppUow
{
void Commit();
IRepository<Customer> Customer{ get; } // IRepository<T>
IOrderRepository Order{ get; } // implements IRepository<T>
}
我的问题是:
如果我需要添加任何类型的新存储库,我必须更改UoW。这是一个好习惯吗?如果没有,有更好的方法吗?
如果我运行Commit()(context.SaveChanges),它将保存所有contexts存储库的状态。这是一个好方法吗?
答案 0 :(得分:1)
EntityFramework已经构建了一个工作单元。这使您可以调用 context.SaveChanges 来存储所有更改,因此您不应该包含另一个工作单元模式。您应该在代码中直接使用 IRepository 或 IOrderRepository 。
问题:
没有。根据您的应用程序对订单和客户的作用,您可以将它们放在一个存储库中。如果您最重要的是对Orders感兴趣并且只想知道在哪里发货,那么这个存储库和一个上下文就足够了。请不要将你的UoW包裹在EF周围。
如果您只有一个EF上下文和多个使用它的存储库,则在OrderRepository上调用Save时将保存所有挂起的更改。如果您希望仅保存OrderRepository中的更改而不保存CustomerRepository中的更改,则会出现问题。您可以使用不同的EF上下文对象解决此问题,但是您将遇到问题,对象图中的哪些对象由 context1 加载,哪些对象由 context2 加载。我建议您按照EF方式完成并构建一个上下文,当您调用save时,所有对象都会被保存。要拆分它,您需要确定应用程序如何处理数据。
您可以找到EF和ASP.NET MVC here的代码示例。