0

У меня есть консольное приложение и веб-API, которые ссылаются на тот же слой данных, который является отдельным проектом.Как настроить контейнер Windor на консольном приложении для ввода внешней библиотеки

В этом слое данных у меня есть класс, для которого требуется репозиторий, который мы захватываем из контейнера при создании экземпляра этого класса.

В этом классе, он имеет базовый класс, который мы делаем следующие в конструкторе для настройки Repository:

IContainerAccessor containerAccessor = HttpContext.Current.ApplicationInstance as IContainerAccessor; 
Repository = containerAccessor.Container.Resolve<IRepository>(); 

Что бы лучший способ установить это? Это, очевидно, проблема для нашего консольного приложения, поскольку он не имеет HttpContext.

+0

одной из нескольких причин локатора службы считается анти- pattern: http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ –

+0

Почему вы не вводите 'IRepository' через конструктор вместо использования локатора сервисов (' IContainerAccessor')? –

ответ

0

Если я прав, вы хотите настроить консольное приложение, чтобы он мог вводить классы из общего уровня данных.

Для этого вам необходимо создать установщик для консольного приложения и сообщить ему, чтобы он запускал установщиков в общей библиотеке, но чтобы изменить стиль жизни с «PerWebRequest» на «Singleton» или «Transient».

Для получения более подробной информации прочитайте эту статью: http://blog.ploeh.dk/2010/04/26/ChangingWindsorlifestylesafterthefact/

Имейте в виду, что изменение это может вызвать проблемы. I.e .: Если для нескольких компонентов, настроенных как «perWebRequest», требуется ввести «Unit-Of-Work», то для всех компонентов это будет отличаться для всех компонентов, если вы измените стиль жизни на переходный период. Изменение его на Синглтон вызывает ту же, но противоположную проблему. Объекты, которые создаются теперь будут иметь один и тот же объект для различных запросов ...

Если вы хорошо с проблемами этого кода вы должны получить, начиная

public class ConsoleAppInstaller: IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     // 1) make sure we do not use PerWebRequest life style types 
     var convertWebToTransient = new WebToTransientConvertor(); 
     container.Kernel.ComponentModelBuilder.AddContributor(convertWebToTransient); 

     // 2) call installers on all libraries we use ... 
     container.Install(FromAssembly.Containing<SharedDataLayerInstaller>()); 


     // 3) link internal services ... 
     container.Register(Component.For<IXxxxFactory>().AsFactory()); 
     container.Register(Component.For<IYyyyFactory>().AsFactory()); 
     container.Register(Classes.FromThisAssembly().Where(c => typeof(Form).IsAssignableFrom(c)).LifestyleTransient()); 
    } 

    public static IWindsorContainer Bootstrap() 
    { 
     return new WindsorContainer().Install(FromAssembly.This()); 
    } 
} 

/// <summary> 
/// This class allows to intercept installers using PerWebRequest lifestyles and replaces them with Transient life styles. 
/// <code>container.Kernel.ComponentModelBuilder.AddContributor(new WebToTransientConvertor())</code> 
/// </summary> 
public class WebToTransientConvertor : IContributeComponentModelConstruction 
{ 
    //http://blog.ploeh.dk/2010/04/26/ChangingWindsorlifestylesafterthefact/ 
    public void ProcessModel(IKernel kernel, ComponentModel model) 
    { 
     if (model.LifestyleType == LifestyleType.PerWebRequest) 
      //model.LifestyleType = LifestyleType.Transient; 
      model.LifestyleType = LifestyleType.Singleton; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^