我正在使用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());
});
}
但是,我不禁想到从_container的初始化中引用_container似乎很尴尬。这是可接受的做法吗?是否会在路上适得其反?有没有更好的办法?如何处理需要创建另一个依赖项以创建自己的依赖项?
答案 0 :(得分:2)
似乎没有必要使用对容器内容器实例的引用。您可以通过lambda访问Use-method中的容器。
r.For<ISession>().HybridHttpOrThreadLocalScoped()
.Use(c => c.GetInstance<ISessionFactory>().OpenSession());
这将确保每次进入新的HttpContext时都会获取实例。在我看来,你的方式会创建一个单例,因为_container.GetInstance<ISessionFactory>().OpenSession()
只会在配置时执行一次。