在StructureMap中为两个接口注册一种类型

时间:2012-03-06 17:17:04

标签: dependency-injection inversion-of-control structuremap

是否可以在 StructureMap 中为TWO界面注册一种类型?看:

public interface IUnitOfWork { }

public interface IUnitOfWork<TSession> : IUnitOfWork { }

public class NHibernateUnitOfWork : IUnitOfWork<ISession> { }

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

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

但我不知道这是不是这个?你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

请参阅转发命令,如以下答案所示:

https://stackoverflow.com/a/2366838/156533

如果你不想要单身,你只需要改变生命周期。

答案 1 :(得分:0)

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

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

在解析IUnitOfWorkIUnitOfWork<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