Как получить экземпляр службы в Виндзорском замке

В многоуровневом приложении (проект ASP MVC: UI, проект DAL) я зарегистрировал в web.config компоненты.

Теперь у меня возникла проблема: шаблон «Единица работы» уже реализован, и мне нужно получить текущий экземпляр конкретной службы. Регистрация служб произошла в проекте пользовательского интерфейса, но мне нужно получить текущий экземпляр этой службы в проекте DAL. Как мне получить эту ссылку?

В проекте пользовательского интерфейса мне уже нужен был способ решить какую-то проблему:

container = new WindsorContainer(
                new XmlInterpreter(new ConfigResource("castle"))
            );
            personRepository= container.Resolve<IPersonRepository>();

Можно ли использовать ту же технику в проекте DAL? Если да, следует ли мне записать конфигурацию в отдельный файл, чтобы он был доступен для всех слоев (проектов)?

Извините за этот (я думаю) наивный вопрос, но это мой первый проект, использующий Castle, и я думаю, что не понимаю его всей картины!

Фрагмент кода очень поможет.

Заранее спасибо!


person savvas sopiadis    schedule 07.11.2009    source источник


Ответы (2)


В двух словах: один экземпляр контейнера на приложение, одна конфигурация контейнера, в которой есть все компоненты, необходимые для приложения. Если вам нужна служба в вашем DAL, вставьте соответствующий интерфейс службы в свой класс DAL через конструктор (если зависимость требуется) или установщик (если зависимость необязательная). .

Очень старайтесь избегать использования статического шлюза IoC, он скрывает истинные зависимости компонента и затрудняет тестирование.

См. Эти связанные вопросы:

person Mauricio Scheffer    schedule 08.11.2009
comment
Я понимаю вашу точку зрения! Но вот чего я не понимаю: как именно это нужно делать! DAL - это самостоятельная сборка. В каком классе я просто использую (контейнер IWindsorContainer) в качестве параметра конструктора? Если да, разве мне не нужно регистрировать сам контейнер (в проекте пользовательского интерфейса)? как? Или можно (нужно) использовать что-то вроде этого: WindsorContainer container = new WindsorContainer (); container.Resolve ‹IUnitOfWork› (); что означает отсутствие внедрения конструктора. ... думаю, я не понимаю, как это делать! - person savvas sopiadis; 09.11.2009
comment
Нет, избегайте прямого вызова контейнера. Неважно, если это другая сборка, это все равно то же приложение. Используйте этот проект как ссылку: code.google.com/p/blogsharp - person Mauricio Scheffer; 09.11.2009

Прочтите эту статью. Он показывает вам, как написать статический класс, который выполняет разрешение зависимостей с помощью Castle Windsor. Вам следует подумать о том, чтобы поместить этот класс в отдельный проект, на который можно ссылаться как из ваших проектов пользовательского интерфейса, так и из DAL, чтобы разрешить повторное использование кода. Как объясняется в статье, ваш класс должен предоставлять средство начальной загрузки, которое инициализирует ваш контейнер IoC. В вашем случае это будет выглядеть так:

public static class IoC
{
    private WindsorContainer _container;

    public static void Initialize()
    {
        _container = new WindsorContainer(
            new XmlInterpreter(new ConfigResource("castle"))
        );
    }
} 

Загрузчик будет вызываться из события запуска приложения в файле Global.asax проектов пользовательского интерфейса.

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

person pmarflee    schedule 08.11.2009
comment
Пожалуйста, не рекомендую это делать. Статический шлюз IoC - это последний ресурс, который получает возможности IoC в среде, враждебной IoC. Вместо этого следует поощрять регулярные практики DI. - person Mauricio Scheffer; 08.11.2009