使用SimpleInjector注入ISession时,生活方式不匹配

时间:2016-09-10 06:28:30

标签: c# .net nhibernate dependency-injection simple-injector

我有一个域服务,它将ISession作为Ctor中的依赖项。

public JobCreator(IMapper mapper, ISession session)
{
    _mapper = mapper;
    _session = session;
}

该服务已注册为Singleton

container.Register<IKindergardenCreator, KindergardenCreator>(Lifestyle.Singleton);

然而,ISession被注册为作用域,因为会话应该重新打开多次。

container.Register<ISession>(() => container.GetInstance<ISessionFactory>().OpenSession(), 
    Lifestyle.Scoped);

当我运行应用程序时,我得到了一个&#34;生活方式不匹配&#34;因为这种配置。使用非单件服务配置单件服务的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

  

使用非单件服务配置单件服务的正确方法是什么?

异常信息涉及以下文档

documentation about lifestyle mismatches解释了如何修复违规行为:

  
      
  • 将组件的生活方式改变为与依赖关系一样短或短的生活方式。
  •   
  • 将依赖的生活方式改变为生活方式的长度或长度。
  •   
  • 不是注入依赖项,而是注入工厂来创建该依赖项,并在每次需要实例时调用该工厂。
  •   

由于您不能提高ISession依赖关系的生活方式,您应该降低消费组件的生活方式(KindergardenCreator)或者为ISession注入工厂。

您可以按如下方式降低组件的生活方式:

container.Register<IKindergardenCreator, KindergardenCreator>(Lifestyle.Scoped);

您还可以将ISession依赖关系更改为Func<ISession>并将其注册为工厂,如下所示:

container.RegisterSingleton<Func<ISession>>(container.GetInstance<ISession>);