Unity,每个请求的生命周期

时间:2013-04-22 22:28:30

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

我想知道我如何使用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实例?

1 个答案:

答案 0 :(得分:0)

我想我已经设法解决了这个问题 - 我认为我的问题是HttpContext.Current在一个类库中,所以似乎没有正确解析,使用callcontext似乎解决了这个问题。