【问题标题】:Repository, IRepository and structuremap存储库、IRepository 和结构图
【发布时间】:2011-05-17 06:44:07
【问题描述】:

我有一个接口 IRepository 和一个实现 EFRepository。
我使用结构映射注入来获取存储库实现。
现在 EFRepository 有没有参数的构造函数,所以 structuremap 知道很容易在 EFRepository 上检索实例。

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

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

示例
直到今天我还在使用:

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

【问题讨论】:

  • 澄清一下,您是说要在构造函数中添加参数,并且要确保 StructureMap 可以注入适当的依赖项?

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


【解决方案1】:

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

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

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

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

public MyClass(IUnitOfWork unit) { ... }

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

【讨论】:

  • @Roy Dictus:但是如果结构图将为我创建工作单元,我将不需要 using 语句,这样我将无法处理工作单元.. 你能举个例子如何在您的解决方案中使用工作单元和存储库?
  • 如果你的工作单元需要被释放——也就是说,如果它拥有非托管资源——你需要在它上面实现 IDisposable 接口。然后,当不再需要您的对象时,StructureMap 会正确处理它。
  • @Roy Dictus:我的 UnitOfWork 实现了 IDisposable。你确定 StructureMap 会自动处理它吗?
  • @Roy Dictus:这里他们说结构映射不会自动处理:stackoverflow.com/questions/5015354/…
  • 那是另一回事。在您提到的讨论中,使用服务定位器/对象工厂创建了一个显式实例。这与构造函数注入不同。通过构造函数注入,IOC 容器(在本例中为结构映射)是创建实例的容器。
【解决方案2】:

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

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

【讨论】:

  • 我投票赞成正确并回答了所提出的确切问题。但是,我认为 Roy Dictus 答案中的指导是一种更好的方法(尽管它需要提及嵌套容器以进行正确处理)。
  • @Joshua - 我同意,从架构的角度来看,Roy 的回答更好,而且是创建合乎逻辑且可维护的解决方案的正确方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2020-03-05
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多