【发布时间】:2013-01-11 10:59:27
【问题描述】:
我在 EF 中遇到了一些问题,正在寻找解决这个问题的最佳实践:
public void TestEntityFramework_UOWImplementation()
{
using (UnitOfWorkInventory uow = new UnitOfWorkInventory())
{
IMaterialRepository repos = new MaterialRepository(uow);
Material mat = GetMaterial("Mikes Material", 1);
mat.CostPrice = 20;
repos.InsertOrUpdate(mat);
uow.Commit();
}
}
private Material GetMaterial(string sku, int clientId)
{
IMaterialRepository repos = new MaterialRepository(new UnitOfWorkInventory();
return repos.Find(sku, clientId);
}
在 TestEntityFramework_UOWImplementation() 方法中,它很好,我调用为我的工作单元创建一个范围......并在其中创建一个存储库。
但是当我想 getMaterials() 如下时.. 我无法访问工作单元或存储库,除非我实际上将它作为参数传递!这显然不是特别好。
人们如何解决这个问题??
提前致谢!
尼尔
【问题讨论】:
-
不应该
GetMaterial是MaterialRepository类中的实例方法吗? -
这是一个好点! :) 但是说在某些情况下你想做一个 Where() .. 我想这些也会在回购中。谢谢!现在我看到它写得很明显:)
-
实际上,假设需要几个 repo 查询。您认为不会出现在回购之外进行查询的情况吗?或者说我有一些名为 CalculateMaterialPrices() 的方法,它需要一个材料列表来计算。你会在 TestEntityFramework_UOWImplementation() 方法或 CalculateMaterialPrices() 方法中调用 repo GetMaterials() 方法,如果是后者,你将如何访问 repo?还是我不是在正确的轨道上!
-
现在更多的框架期望使用
IQueryable<T>- 我正在考虑诸如Web API之类的东西 - 所以向每个只返回一个的存储库添加一个方法会很有用。这也满足了您所描述的用例,您希望在存储库之外指定查询。这是否会破坏封装是有争议的,但它可以完成工作! -
它是一种解决方法,但绝对不是一个好的解决方案。有没有办法解决这个问题?
标签: entity-framework repository-pattern unit-of-work