C# 存储库、IRepository和结构图

C# 存储库、IRepository和结构图,c#,entity-framework,repository,structuremap,unit-of-work,C#,Entity Framework,Repository,Structuremap,Unit Of Work,我有一个接口eRepository和一个实现eRepository。 我使用structuremap注入来实现存储库。 目前,eFrapository的构造函数没有参数,因此structuremap知道如何轻松检索eFrapository上的实例 现在,我需要更改存储库实现,以便它将在保存工作单元的构造函数参数中接收 在这种情况下,我的问题是,如何使用structuremap来返回使用工作单元初始化的实例 示例 直到今天,我一直使用: using(IUnitOfWork uow=UnitOfWo

我有一个接口eRepository和一个实现eRepository。
我使用structuremap注入来实现存储库。
目前,eFrapository的构造函数没有参数,因此structuremap知道如何轻松检索eFrapository上的实例

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

在这种情况下,我的问题是,如何使用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
使用(IUnitOfWork uow=UnitOfWork.current){
IRepository rep=ObjectFactory.GetInstance();
//使用上面初始化的UnitOfWork.current的存储库操作
}//此处处置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
使用(IUnitOfWork uow=new UnitOfWork()){
//不确定这是我告诉sructure map使用承包商的方式
//获得工作许可证)
IRepository rep=ObjectFactory.GetInstance(uow);
//使用上面初始化的uow的存储库操作
}//在这里处理工作单元

我在这里假设您的工作单元是特定于请求的。。。因此,您有一个服务(WCF?),每个传入的请求都有自己的工作单元

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

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

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

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

IRepository rep=ObjectFactory.With(uow)。
GetInstance();

我想澄清一下,你是说你想在构造函数中添加一个参数,并且你想确保StructureMap可以注入适当的依赖项吗?@Roy Dictus:但是如果StructureMap将为我的创建工作单元,我就不需要使用语句,这样我就无法处理工作单元。。您能否举例说明如何在您的解决方案中使用工作单元和存储库?如果您的工作单元需要被处置——也就是说,如果它包含非托管资源——您将需要在其上实现IDisposable接口。StructureMap将在对象不再需要时正确处理它。@Roy Dictus:my UnitOfWork实现IDisposable。你确定StructureMap会自动处理吗?@Roy Dictus:这里他们说StructureMap不会自动处理:那是另一回事。在您提到的讨论中,使用服务定位器/对象工厂创建了一个显式实例。这与构造函数注入不同。通过构造函数注入,IOC容器(在本例中为StructureMap)就是创建实例的容器。我投票证明这是正确的,并回答了确切的问题。然而,我认为Roy Dictus答案中的指导是一个更好的方法(尽管它需要提到嵌套容器以便正确处理)。@Joshua-我同意,Roy的答案从架构的角度来看更好,并且是为了创建一个逻辑性和可维护的解决方案
public MyClass(IUnitOfWork unit) { ... }
IRepository rep = ObjectFactory.With<UnitOfWork>(uow).
  GetInstance<IRepository<T>>();