我有一个类,它的构造函数需要一个字符串作为参数,但这个参数将由调用代码决定。在同一时间点,此类的生命周期必须与每个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"/>
我有另一个问题。如果使用代码配置和注入依赖项的上述方法是正确的,那么我认为我不需要配置条目。我总是可以使用合适的重载来推送自定义生命周期管理器。如果我想仅使用配置文件来实现相同的功能,那么我该如何编写解决方案呢?
答案 0 :(得分:1)
如果您使用基于容器的工厂,则无需在每次通话中注册/解析IPerformanceTracer
。
注册映射IPerformanceTracer
- &gt; PerformanceTracer
一次在配置文件中,并在解析界面时使用ParameterOverride
。
public IPerformanceTracer CreateInstance(string operationTitle)
{
return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle);
}