У меня есть класс, которому нужна строка в качестве параметра в его конструкторе, но этот параметр будет определяться вызывающим кодом. В то же время время жизни этого класса должно быть привязано к каждому 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"/>
У меня есть еще один вопрос. В случае, если описанный выше способ настройки и внедрения зависимости с использованием кода правильный, то я думаю, что мне не нужны записи конфигурации. Я всегда могу использовать подходящую перегрузку, чтобы нажать настраиваемый менеджер времени жизни. В случае, если я хотел бы добиться того же, используя только файл конфигурации, то как мне закодировать решение?