Как правильно отделить решатель зависимостей Structure Map от веб-проекта ASP.NET MVC? - PullRequest
0 голосов
/ 09 февраля 2011

При разработке веб-проекта с использованием ASP.NET MVC я столкнулся с проблемой сопряжения.Когда я создаю собственную фабрику контроллеров (или средство разрешения зависимостей при использовании MVC 3), мне нужно, чтобы эта фабрика каким-то образом знала, где получить зависимости.Вот мой код:

//from Global.asax.cs

DependencyResolver.SetResolver(new StructureMapControllerFactory());
class StructureMapControllerFactory: IDependencyResolver {
    Container repositories;

    public StructureMapControllerFactory()
    {
        repositories = new RepositoriesContainer();
    }
    //... rest of the implementation
}
class RepositoriesContainer: Container
{
   public RepositoriesContainer()
   {
      For<IAccountRepository>().Use<SqlAccountRepository>();
      //...
   }
}

StructureMapControllerFactory класс отвечает за внедрение зависимостей в контроллер.Как я уже сказал, он должен знать, где найти эти зависимости (я имею в виду конкретные классы, такие как реализации сервисов и репозиториев).

У меня есть отдельная библиотека классов с именем MySite.Data, где живут все детали реализации.Контракты, вроде IAccountRepository, живут в библиотеке MySite.Contracts.Теперь, если я ссылаюсь на эту библиотеку MySite.Data непосредственно из проекта MVC, между моим сайтом и реализацией его поиска данных будет зависимость.Вопрос в том, как я могу это удалить?Каковы лучшие практики в этой ситуации?

Я уверен, что у нее есть куча обходных путей, просто я еще не нашел.

1 Ответ

3 голосов
/ 09 февраля 2011

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

В любом случае вам нужно будет где-то предоставить эти регистрации контейнеров, и вы получите зависимость от проекта / сборки, где определен этот тип. Вкратце, вы должны ссылаться на MySite.Data из проекта MVC. Вот так:

  • MySite.Data ничего не знает о проекте MVC
  • Проект MVC знает конкретные типы репозиториев для обеспечения правильной регистрации контейнеров.

Вы можете упростить жизнь с объектами StructureMap Registry, но вам нужно куда-то включить эти реестры. Как правило, они находятся в основном проекте или в каком-то проекте StructureMap-адаптера, но вам все равно придется ссылаться.

Я бы посоветовал вам:

  • Используйте MVC3 и оставьте свой пользовательский IControllerFactory, если вы используете его только для DI в свой Controllers.
  • Используйте объекты StructureMap Registry для предоставления каждой когда-либо необходимой регистрации IoC.
  • Используйте возможности сканирования StructureMap Assembly для обеспечения обнаружения компонентов.
  • Используйте что-то гораздо более распространенное, например DependencyResolver, т. Е. Не StructureMapControllerFactory, а CommonServiceLocator с адаптером StructureMap .
  • Попробуйте абстрагироваться от самой StructureMap внутри вашего основного приложения.

И, конечно же, не бойтесь делать ссылки внутри основного проекта - они не имеют ничего общего со связью. Это не уменьшает ремонтопригодность. Но неправильная архитектура делает, так что беспокойтесь об этом, а не просто ссылка.

...