存储库、独立和结构图

本文关键字:结构图 独立 存储 | 更新日期: 2023-09-27 17:56:54

我有一个接口 IRepository 和一个实现 EFRepository。
我使用结构图注入来获取存储库实现。
现在,EFRepository具有没有参数的构造函数,因此结构图知道可以轻松地检索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

存储库、独立和结构图

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

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

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

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

public MyClass(IUnitOfWork unit) { ... }

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

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

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