Castle Windsor: регистрация компонентов в нескольких проектах в решении - PullRequest
3 голосов
/ 05 июня 2011

Я бы хотел использовать Castle Windsor для внедрения зависимостей для моего решения, состоящего из следующих проектов:

  1. Mvc [Веб-приложение ASP.NET MVC 3]: уровень представления (зависит от Бизнес и Модели )
  2. Бизнес [Библиотека классов]: бизнес-уровень (зависит от DataAccess и Модели )
  3. DataAccess [Библиотека классов]: уровень доступа к данным (зависит от Модели )
  4. Модели [Библиотека классов]: слой модели

На бизнес-уровне есть класс PostService, реализующий IPostService, который управляет сообщениями в блоге. PostsController проекта Mvc зависит от IPostService. Однако PostService (соответствующая конкретная реализация) сама зависит от IPostRepository.

Где я могу настроить Castle Windsor, чтобы он возвращал экземпляр PostRepository для разрешения IPostRepository? Проект Mvc не знает о проекте DataAccess . Таким образом, я не могу настроить привязки компонентов в global.asax или где-то еще в Mvc .


[Обновить] Диаграмма зависимостей

Теперь, когда я нашел решение (еще раз спасибо, Дарин Димитров!), Я хотел бы поделиться с вами текущей диаграммой зависимостей.

Project dependencies

Ответы [ 4 ]

9 голосов
/ 05 июня 2011

Создание и размещение классов установщика Windsor (реализации интерфейса IWindsorInstaller) в ваших библиотеках классов, например:

public class PostRepositoryInstaller: IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        var allTypesFromBinDir = AllTypes
            .FromAssemblyInDirectory(new AssemblyFilter(HttpRuntime.BinDirectory));

        container.Register(allTypesFromBinDir
            .BasedOn<IPostRepository>()
            .WithService.FromInterface()
            .Configure(c => c.LifeStyle.Transient));
    }
}

Затем в вашем Global.asax установите ваши зависимости:

protected virtual void Application_Start()
{
    new WindsorContainer().Install(FromAssembly.InDirectory(new AssemblyFilter(HttpRuntime.BinDirectory)));
}
1 голос
/ 05 июня 2011

Используйте установщики. из global.asax вы можете позвонить:

_container.Install(FromAssembly.InDirectory(new AssemblyFilter(HttpRuntime.BinDirectory, "YourNamespaceToScan*.dll")));

В своих бизнес-проектах, проектах DA и Model вы можете добавить установщики для установки зависимостей для каждого:

 public class ServicesInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
               ...);
        }
    }
0 голосов
/ 06 июня 2011

Вы должны спросить себя об одном: « мне действительно нужны 4 разные сборки для моего проекта MVC? » Вы должны разбить код на сборки в соответствии с границами развертывания , а непросто на основе какого-то смутного представления о том, что код модели должен быть физически отделен от бизнес-кода и тому подобного.Вы должны использовать пространства имен для таких вещей вместо отдельных проектов.

Вот хорошая статья по этому вопросу: Советы по разбиению кода через сборки .NET Патрика Смаккья.

0 голосов
/ 05 июня 2011

Вы должны сконфигурировать контейнер DI в проекте MVC. Это где все входит в жизнь. Здесь все ссылки должны быть включены, включая уровень доступа к данным (без ссылки на конкретный доступ к данным ваше приложение MVC просто не может работать). Таким образом, приложение MVC знает все о других уровнях. Application_Start в Global.asax - хорошее место для настройки контейнера DI.

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