【发布时间】: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