2012-02-20 6 views
1

У меня есть класс, которому требуется строка в качестве параметра в своем конструкторе, но этот параметр будет определяться вызывающим кодом. В то же время время жизни этого класса должно быть привязано к HTTP-запросу. Итак, я создал собственный PerWebRequestTimelineManager и использовал его для моего целевого типа в файле конфигурации. Но так как строка в конструкторе должна быть динамически определена, я не могу использовать ConstructorInjection через файл конфигурации. Я могу использовать абстрактную фабрику для решения проблемы динамической зависимости, но я не уверен в ее реализации: можете ли вы проверить код ниже и проверить подход. В частности, RegisterType и решимостью вызовы, кажется, немного неуместны, хотя последовательные вызовы Resolve через приложения будет иметь возможность получить тот же экземпляр .:Задать зависимость параметра времени выполнения в Unity

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

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

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

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

Большое спасибо за ваш ответ Себастьян. Это прекрасно разрешило проблему. У меня есть еще одна услуга, чтобы спросить, чтобы избежать подобных проблем из-за незнания полного API. Какое место лучше всего подходит для документации Unity API? – koder

+0

@ user608100 Извините, что разочаровал вас, но документация Unity в целом ужасна. Некоторая информация может быть найдена на [MSDN] (http://msdn.microsoft.com/en-us/library/ff663144.aspx). Но вы должны сами выучить большую часть этого материала. В настоящее время я работаю над двумя статьями, которые будут помещены на сайт Unity на CodePlex, который проливает свет на внутренности Unity. Но для перевода потребуется еще немного времени. –