Simple Injector - 将构造函数参数传递给容器

时间:2015-09-22 18:51:11

标签: nhibernate simple-injector

我正在将我的应用程序从Ninject转换为Simpler Injector。我试图通过getInstance()将构造函数参数(在本例中为NHibernate会话)传递到容器中。在ninject中,这是通过使用以下内容完成的:

AsRef<str>

如何使用Simple Injector完成此操作?我有HibernateFactory类,其中使用存储库进行绑定:

return _kernel.Get<IRepository<T>>(new ConstructorArgument("mysession", GetMySession()));

MyLocator类具有以下内容:

        public class NHSessionFactory : IMySessionFactory
        {
            private readonly ISessionFactory myNHSessionFactory;

            public NHSessionFactory(Assembly[] myMappings){

                this.myNHSessionFactory = InitNHibernate(myMappings);

                MyLocator.MyKernel.Bind(typeof(IRepository<>)).To(typeof(NHRepository<>));
            }

            public IMySession CreateSession()
            {
                return new NHSession(this.myNHSessionFactory.OpenSession());
            }
            ....

请告诉我如何使用Simple Injector实现这一目标。我已经读过Simple Injector不允许通过检索方法(即getInstance)传递运行时值的开箱即用支持。有哪些替代方案?是否有注册(RegisterConditional)的选项,如果有,如何?

1 个答案:

答案 0 :(得分:2)

没有开箱即用的支持将运行时值传递到GetInstance方法以完成自动布线过程。这是因为它通常是次优设计的标志。有ways around this,但总的来说我建议不要这样做。

在您的情况下,即使在您当前的设计中,在对象构造期间(即使使用Ninject)也不必将会话作为运行时值传递。如果您只是在容器中注册ISession,您可以让Simple Injector(或Ninject)为您自动连接它,而不必将其作为运行时值传递。这甚至可以消除对IMySessionFactory抽象和实现的需要。

您的代码可能看起来像这样:

Assembly[] myMappings = ...
ISessionFactory myNHSessionFactory = InitNHibernate(myMappings);

container.Register<IMySession>(myNHSessionFactory.OpenSession, Lifestyle.Scoped);

container.Register(typeof(IRepository<>), typeof(NHRepository<>));

使用此配置,您现在可以使用container.GetInstance<IRepository<SomeEntity>>()解析存储库,或使用IRepository<T>作为构造函数参数。