是否可以在 StructureMap 中为TWO界面注册一种类型?看:
public interface IUnitOfWork { }
public interface IUnitOfWork<TSession> : IUnitOfWork { }
public class NHibernateUnitOfWork : IUnitOfWork<ISession> { }
我想为NHibernateUnitOfWork
和IUnitOfWork
注册IUnitOfWork<TSession>
,例如NHibernateUnitOfWork
-per http请求的一个实例 - 负责IUnitOfWork
和IUnitOfWork<TSession>
。我使用这个注册表:
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>();
For<IUnitOfWork<>>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>();
但我不知道这是不是这个?你能帮帮我吗?
答案 0 :(得分:2)
答案 1 :(得分:0)
在查看该注册时,我希望容器在单个HTTP上下文中为两个注册创建单个NHibernateUnitOfWork
。换句话说,我希望以下测试失败:
var uow1 = container.GetInstance<IUnitOfWork>();
var uow2 = container.GetInstance<IUnitOfWork<ISession>>();
Assert.IsTrue(object.ReferenceEquals(uow1, uow2));
在解析IUnitOfWork
和IUnitOfWork<ISession>
时,您可能正在让容器在同一个实例中进行回溯,这会使之前的测试通过。
您可以将注册更改为以下内容:
For<NHibernateUnitOfWork>().HybridHttpOrThreadLocalScoped();
For<IUnitOfWork>().LifecycleIs(new UniquePerRequestLifeStyle())
.Use(() => container.GetInstance<NHibernateUnitOfWork>());
For<IUnitOfWork<ISession>>().LifecycleIs(new UniquePerRequestLifeStyle())
.Use(() => container.GetInstance<NHibernateUnitOfWork>());
在这种情况下,每次您请求IUnitOfWork
时,您都会回到容器中并请求NHibernateUnitOfWork
,其配置为HybridHttpOrThreadLocalScoped
。