我正在将我的应用程序从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)的选项,如果有,如何?
答案 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>
作为构造函数参数。