在Unity中指定运行时参数依赖项

时间:2012-02-20 14:59:20

标签: unity-container constructor-injection

我有一个类,它的构造函数需要一个字符串作为参数,但这个参数将由调用代码决定。在同一时间点,此类的生命周期必须与每个HTTP请求相关联。因此,我创建了一个自定义PerWebRequestTimelineManager并将其用于配置文件中的目标类型。但由于构造函数中的字符串必须动态确定,因此我无法通过配置文件使用ConstructorInjection。我可以使用抽象工厂来解决动态依赖的问题,但我不确定实现:你能检查下面的代码并验证方法。具体来说,RegisterType和Resolve调用看起来有点不合适,尽管跨应用程序的连续Resolve调用将能够检索相同的实例。:

public class PerformanceTracerFactory : IPerformanceTracerFactory
{
    private readonly IPerformanceTracer tracer;

    public IPerformanceTracer CreateInstance(string operationTitle)
    {
        _container.RegisterType<IPerformanceTracer, PerformanceTracer>(new InjectionConstructor(operationTitle));

        return _container.Resolve<IPerformanceTracer>();
    }
}

配置文件的相关部分:

<register type="IPerformanceTracer" mapTo="PerformanceTracer">
  <lifetime type="PerWebRequest"/>
</register>
<register type="IPerformanceTracerFactory" mapTo="PerformanceTracerFactory"/>

我有另一个问题。如果使用代码配置和注入依赖项的上述方法是正确的,那么我认为我不需要配置条目。我总是可以使用合适的重载来推送自定义生命周期管理器。如果我想仅使用配置文件来实现相同的功能,那么我该如何编写解决方案呢?

1 个答案:

答案 0 :(得分:1)

如果您使用基于容器的工厂,则无需在每次通话中注册/解析IPerformanceTracer

注册映射IPerformanceTracer - &gt; PerformanceTracer一次在配置文件中,并在解析界面时使用ParameterOverride

public IPerformanceTracer CreateInstance(string operationTitle)
{
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle);
}