1

是否可以在StructureMap中注册一种类型的TWO接口?看:在StructureMap中为两个接口注册一种类型

public interface IUnitOfWork { } 

public interface IUnitOfWork<TSession> : IUnitOfWork { } 

public class NHibernateUnitOfWork : IUnitOfWork<ISession> { } 

我想为这两个IUnitOfWorkIUnitOfWork<TSession>例如注册NHibernateUnitOfWork一个NHibernateUnitOfWork -per http请求的实例 - 负责IUnitOfWorkIUnitOfWork<TSession>。我使用这个注册表:

For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>(); 
For<IUnitOfWork<>>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>(); 

但我不知道这是否正确?你能帮我吗?

回答

0

查看注册时,我希望容器在单个HTTP上下文中为两个注册创建一个NHibernateUnitOfWork。换句话说,我希望下面的测试失败:

var uow1 = container.GetInstance<IUnitOfWork>(); 
var uow2 = container.GetInstance<IUnitOfWork<ISession>>(); 
Assert.IsTrue(object.ReferenceEquals(uow1, uow2)); 

你可能后具有容器解决什么都IUnitOfWorkIUnitOfWork<ISession>,这将使前面的测试过程,当returing相同的实例。

您可以将您的注册更改为以下:

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

相关问题