存储库、独立和结构图
本文关键字:结构图 独立 存储 | 更新日期: 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>>();