Dependency injection StructureMap嵌套依赖关系处理

Dependency injection StructureMap嵌套依赖关系处理,dependency-injection,structuremap,Dependency Injection,Structuremap,我正在使用StructureMap进行依赖注入,我想用它注入NHibernate会话。我有以下代码: private static Container _container { get; set; } static MyClass() { _container = new Container(r => { r.For<ISessionFactory>().Singleton() .Use(NHibernate.GetS

我正在使用StructureMap进行依赖注入,我想用它注入NHibernate会话。我有以下代码:

private static Container _container { get; set; }

static MyClass() 
{
    _container = new Container(r =>
    {
        r.For<ISessionFactory>().Singleton()
            .Use(NHibernate.GetSessionFactory());

        r.For<ISession>().HybridHttpOrThreadLocalScoped()
            .Use(_container.GetInstance<ISessionFactory>().OpenSession());
    });
}
私有静态容器_容器{get;set;}
静态MyClass()
{
_容器=新容器(r=>
{
r、 For().Singleton()
.Use(NHibernate.GetSessionFactory());
r、 For().HybridHttpOrthReadLocalScope()的
.Use(_container.GetInstance().OpenSession());
});
}

然而,我不得不认为从_容器的初始化中引用_容器似乎很尴尬。这是可以接受的做法吗?这会不会适得其反?有更好的办法吗?如何处理需要创建另一个依赖项才能创建自己的依赖项?

似乎没有必要在容器中引用容器的实例。您可以通过lambda访问Use方法中的容器

 r.For<ISession>().HybridHttpOrThreadLocalScoped()
  .Use(c => c.GetInstance<ISessionFactory>().OpenSession());
r.For().HybridHttpOrThreadLocalScoped()
.Use(c=>c.GetInstance().OpenSession());

这将确保每次在新的HttpContext中都会获取实例。在我看来,您的方式将创建一个单例,因为
\u container.GetInstance().OpenSession()
在配置时只执行一次。

这正是我所要寻找的。谢谢我错过了为lambda表达式提供容器的重载。