【问题标题】:Unity, per request lifetimeUnity,每个请求的生命周期
【发布时间】:2013-04-22 22:28:29
【问题描述】:

我想知道如何使用 Unity 执行以下操作....

我有一段简单的代码,其中“按请求”创建对象,在大多数情况下,我使用注入工厂来构建 ILogger 实例(按请求)...如下...

container.RegisterType<ILogger>(new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

到目前为止非常简单......但想象一下,我在单个 Web 请求中多次调用多个对象,当请求进来时,我想创建和使用上面的记录器,但我希望后续调用用于已经存在的实例....如下

// This should use the RegisterType functionality (above) to create a new instance of the logger
public class A : IAIntf
{
    public AConstructor(ILogger log)
    { .. }
}

// This should use the logger which was constructed when A was created
public class B : IBIntf
{
    public BConstructor(ILogger log)
    { .. }
}

这段代码正确地为A类创建了一个接口,但是在创建B类时未能重用接口,使用..

unity.GetService(typeof(T)); // Unity thinks T is IBIntf (which is correct)

.. 但在解决过程中,Unity 无法重用实例化类 A 时创建的 ILogger 类。

我认为问题是Unity需要维护ILogger接口的生命周期,所以我调整了容器注册如下,但是创建了一个新的ILogger:(

container.RegisterType<ILogger>(new HttpRequestLifetimeManager<ILogger>(), 
    new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

// Also tried
container.RegisterType<ILogger>(new PerResolveLifetimeManager(), 
    new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

我如何告诉 unity 给我一个 B 类的新实例,但重用也传递给 A 类的 ILogger 接口,而不是创建一个新的 ILogger 实例?

【问题讨论】:

    标签: .net dependency-injection asp.net-web-api unity-container


    【解决方案1】:

    我想我已经设法解决了这个问题 - 我认为我的问题是 HttpContext.Current 位于类库中,因此似乎无法正确解决,使用 callcontext 似乎可以解决问题。

    【讨论】: