如何使用 LightInject 将接口绑定到方法
How to bind Interfaces to Methods using LightInject
在 Ninject 中,当我想将 NHibernate 的 ISession 绑定到我会做的方法时:
container.Bind<ISession>().ToMethod(CreateSession).InRequestScope();
方法是:
private ISession CreateSession(IContext context)
{
var sessionFactory = context.Kernel.Get<ISessionFactory>();
if (!CurrentSessionContext.HasBind(sessionFactory))
{
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
return sessionFactory.GetCurrentSession();
}
我怎样才能用 LightInject 做同样的事情?
确切的等价物如下:
container.Register<ISession>(factory => CreateSession(factory), new PerRequestLifeTime());
CreateSession 变为:
private ISession CreateSession(IServiceFactory factory)
{
var sessionFactory = factory.GetInstance<ISessionFactory>();
if (!CurrentSessionContext.HasBind(sessionFactory))
{
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
return sessionFactory.GetCurrentSession();
}
Edit: 实际上,这不是 "exact" 等价物,因为 NInject 的 InRequestScope 与 web 请求相关,而 LightInject 的 PerRequestLifeTime 意味着 "PerGetInstanceCall"。
那么您需要的是获取 LightInject Web extension 并以这种方式初始化容器:
var container = new ServiceContainer();
container.EnablePerWebRequestScope();
container.Register<IFoo, Foo>(new PerScopeLifetime());
并使用 PerScopeLifetime 而不是 PerRequestLifeTime
在 Ninject 中,当我想将 NHibernate 的 ISession 绑定到我会做的方法时:
container.Bind<ISession>().ToMethod(CreateSession).InRequestScope();
方法是:
private ISession CreateSession(IContext context)
{
var sessionFactory = context.Kernel.Get<ISessionFactory>();
if (!CurrentSessionContext.HasBind(sessionFactory))
{
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
return sessionFactory.GetCurrentSession();
}
我怎样才能用 LightInject 做同样的事情?
确切的等价物如下:
container.Register<ISession>(factory => CreateSession(factory), new PerRequestLifeTime());
CreateSession 变为:
private ISession CreateSession(IServiceFactory factory)
{
var sessionFactory = factory.GetInstance<ISessionFactory>();
if (!CurrentSessionContext.HasBind(sessionFactory))
{
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
return sessionFactory.GetCurrentSession();
}
Edit: 实际上,这不是 "exact" 等价物,因为 NInject 的 InRequestScope 与 web 请求相关,而 LightInject 的 PerRequestLifeTime 意味着 "PerGetInstanceCall"。 那么您需要的是获取 LightInject Web extension 并以这种方式初始化容器:
var container = new ServiceContainer();
container.EnablePerWebRequestScope();
container.Register<IFoo, Foo>(new PerScopeLifetime());
并使用 PerScopeLifetime 而不是 PerRequestLifeTime