我遇到了一些问题,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()方法中,很好,我调用为我的工作单元创建一个范围..并在其中创建一个存储库。
但是,当我想获取如下的材料()时,我无法访问工作单元或存储库,除非我实际将其作为参数传递!这显然不是特别好。
人们如何解决这个问题?
提前致谢!
尼尔
答案 0 :(得分:3)
在您的实施中,您无法像这样访问工作单元。我所做的是使用IoC容器和依赖注入来处理它。我有一个WCF服务,它使用工作单元和EF5的存储库模式。
您可以阅读有关存储库模式,工作单元和EF here的更多信息,但基本上我所做的是在我的服务类的构造函数中,我像这样注入工作单元:
private readonly IUnitOfWork uow;
public LoanService(IUnitOfWork unitOfWork)
{
uow = unitOfWork;
}
然后我可以在服务中的任何地方使用uow.WhateverMethod。我使用Ninject来处理IUnitOfWork的注入。希望它可以帮到你。
答案 1 :(得分:0)
如果有人想要解决这个问题,我做了一些不同的事情。
我使用了依赖注入框架(StructureMap)来处理所有DI,因此每次实例化存储库时,它都会从StructureMap的服务定位器中检索DBContext。我还将dbcontext范围设置为来自Web服务器的请求持续时间。
这里的优点是每次我检索或注入DBContext时,它将在请求的持续时间内检索相同的上下文,这意味着我可以在多个方法和类中使用它!我将接口类型作为通用参数传递给构造函数,这意味着我可以将repo指向不同的上下文。在有很多dbcontexts的应用程序中很有用。
Repo构造器例如:
public class PurchaseOrderRepository<TDbContext> : GenericRepository<PurchaseOrder>, IPurchaseOrderRepository<TDbContext> where TDbContext : DbContext
{
public PurchaseOrderRepository()
: base((TDbContext)ObjectFactory.GetInstance<TDbContext>())
{
}
}
用法:
//resolves the request scope InventoryContext...
var pRepos = new PurchaseOrderRepository<IInventoryContext>();
,结构映射依赖关系如下:
For<IInventoryContext>().HttpContextScoped().Use<InventoryContext>();