1

我有一个类在其构造函数中需要一个字符串作为参数,但这个参数将由调用代码决定。同时,这个类的生命周期必须与每个 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"/>

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

4

1 回答 1

1

如果您使用基于容器的工厂,则不必IPerformanceTracer在每次调用中注册/解析您的。

在配置文件中注册映射IPerformanceTracer-->PerformanceTracer一次,并ParameterOverride在解析接口时使用。

public IPerformanceTracer CreateInstance(string operationTitle)
{
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle);
}
于 2012-02-20T15:23:41.387 回答