存储库,IRepository和结构图

时间:2011-05-17 06:44:07

标签: c# entity-framework repository structuremap unit-of-work

我有一个接口IRepository和一个实现EFRepository 我使用structuremap注入来获取存储库实现 现在,EFRepository的构造函数没有参数,因此structuremap知道可以轻松地在EFRepository上检索实例。

现在我需要更改存储库实现,以便它将在包含工作单元的构造函数参数中接收。

在这种情况下我的问题是,我如何使用structuremap来返回一个用工作单元初始化的实例?

示例
直到今天我用过:

using(IUnitOfWork uow=UnitOfWork.current) {
    IRepository rep = ObjectFactory.GetInstance<IRepository<T>>();
    //repository operations that uses UnitOfWork.current that initialized above
}// here dispose of UnitOfWork.current

现在我想使用:

using(IUnitOfWork uow=new UnitOfWork()) {
    //Not sure is this is how I tell sructure map to use contractor that 
    //get IUnitOfWork)    
    IRepository rep = ObjectFactory.GetInstance<IRepository<T>>(uow);
    //repository operations that uses uow that initialized above
}// here dispose of UnitOfWork

2 个答案:

答案 0 :(得分:2)

我假设你的工作单元是特定于请求的...所以你有一个服务(WCF?),每个传入的请求都有自己的工作单元。

然后,您可以配置StructureMap以定义每个HTTP请求的单独工作单元。如果您需要没有HTTP请求的单元测试,您可以选择混合生命周期:每个HTTP请求或每个线程。 StructureMap将确定在运行时要做什么。

ObjectFactory.Configure(x => x.For<IUnitOfWork>()
              .HybridHttpOrThreadLocalScoped()
              .Use<MyUnitOfWork>());

您需要构造函数注入的类只是声明它需要一个IUnitOfWork:

public MyClass(IUnitOfWork unit) { ... }

这当然要求使用StructureMap管理/实例化MyClass。

答案 1 :(得分:1)

为了将特定实例传递给ObjectFactory,您可以使用“with”:

IRepository rep = ObjectFactory.With<UnitOfWork>(uow).
  GetInstance<IRepository<T>>();