我有一个接口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
答案 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>>();