Укажите зависимость параметра времени выполнения в Unity - PullRequest
1 голос
/ 20 февраля 2012

У меня есть класс, которому нужна строка в качестве параметра в его конструкторе, но этот параметр будет определяться вызывающим кодом.В то же время время жизни этого класса должно быть привязано к каждому 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 Ответ

1 голос
/ 20 февраля 2012

Если вы используете фабрику на основе контейнеров, вам не нужно регистрировать / разрешать ваш IPerformanceTracer в каждом вызове.

Зарегистрируйте отображение IPerformanceTracer -> PerformanceTracer один раз в вашей конфигурациифайл и используйте ParameterOverride при разрешении интерфейса.

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