0

在 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 做同样的事情?

4

1 回答 1

2

确切的等价物如下:

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();
}

编辑:实际上,这不是“确切”等价物,因为 NInject 的 InRequestScope 与 Web 请求相关,而 LightInject 的 PerRequestLifeTime 表示“PerGetInstanceCall”。然后您需要获取LightInject Web 扩展并以这种方式初始化容器:

var container = new ServiceContainer();
container.EnablePerWebRequestScope();                   
container.Register<IFoo, Foo>(new PerScopeLifetime());  

并使用 PerScopeLifetime 而不是 PerRequestLifeTime

于 2015-04-01T22:26:32.627 回答