Модуль Autofac для сканирования различных приложений

Допустим, вы работаете над проектом ASP.NET MVC, и это слои, разделенные на разные проекты в одном решении. В каждом проекте есть модули autofac, созданные для связывания зависимостей. Теперь я хотел бы отсканировать сборки и зарегистрировать все модули в контейнере.

Я адаптировал метод расширения, аналогичный представленному здесь http://goo.gl/VJEct

public static void RegisterAssemblyModules(this ContainerBuilder builder, Assembly 
assembly)
{
  var scanningBuilder = new ContainerBuilder();

  scanningBuilder.RegisterAssemblyTypes(assembly)
    .Where(t => typeof(IModule).IsAssignableFrom(t))
    .As<IModule>();

  using (var scanningContainer = scanningBuilder.Build())
  {
    foreach (var m in scanningContainer.Resolve<IEnumerable<IModule>>())
      builder.RegisterModule(module);
  }
}

Мой первый вопрос, учитывая, что этот образец был предоставлен несколько лет назад, можно ли использовать эту конструкцию с текущими версиями autofac?

Во-вторых, приложение MVC зависит от функциональности на других уровнях, что означает, что иногда мне нужно регистрировать типы с помощью .InstancePerHttpRequest (). Однако я также хотел бы иметь возможность ссылаться на них из не веб-приложений и не зависеть от System.Web. Как лучше всего зарегистрировать модули, которые можно использовать в этих различных контекстах?


person cecilphillip    schedule 04.04.2012    source источник
comment
Почти год назад ... но все еще любопытно. Удалось ли вам правильно подключить модули приложения MVC, не ссылаясь на mvc, и что вы все еще можете правильно использовать их в жизненном цикле HTTP-запроса? У меня сейчас такая же ситуация, как и у вас. Возможны следующие варианты: все регистрации модулей в веб-проекте или регистрация модулей в каждой сборке ...   -  person Magnus Backeus    schedule 21.10.2013
comment
До сих пор я использовал подход модулей в каждой сборке, где это необходимо. После этого поста autofac включил метод расширения RegisterAssemblyModules в свою основную dll. code.google.com/p/autofac/wiki/Scanning#Module_Scanning. Для проектов, не ссылающихся на какие-либо веб-компоненты, я отлично зарегистрировал компоненты как InstancePerDependency () для большинства общих случаев. Я стараюсь избегать одной огромной регистрации в основном проекте. Я считаю, что таким образом вы откажетесь от небольшой гибкости или даже откажетесь от более сложной настройки регистрации.   -  person cecilphillip    schedule 22.10.2013
comment
В порядке. Хорошая информация. Проблема в том (в моем случае), когда вы регистрируете Entity Framework DBContexts (я использую DDD с несколькими ограниченными контекстами) и хотите внедрить их в репозитории, вы хотите, чтобы у них был срок службы в качестве веб-запроса. Это заставляет меня ссылаться на AutoFac (это нормально), интеграцию AutoFac MVC (хм ... может быть, в порядке) и MVC Web prj (не в порядке). Остальные компоненты в нашем проекте я на самом деле не указал, поэтому они PerDependency. На самом деле я обнаружил, что могу подключить свой DBContext с помощью InstancePerMatchingLifetimeScope (AutofacWebRequest). Я знаю, что это уродливая ссылка.   -  person Magnus Backeus    schedule 25.10.2013
comment
... продолжить: Но для меня это не вариант ссылаться на веб-проект где-либо в другом проекте. Итак, я попробую это решение, и вы, вероятно, могли бы написать собственный метод расширения, который вызывает InstancePerMatchingLifetimeScope (AutofacWebRequest), чтобы вы были уверены, что имя родительского жизненного цикла будет правильным. Проблема в том, что вы хотите использовать те же модули autofac для регистрации DBContexts, которые используются не в WebContext ... например, в фоновом пакете. Тогда вам, вероятно, потребуется использовать MultiTenant (еще не рассматривал) или просто иметь другие модули для пакета.   -  person Magnus Backeus    schedule 25.10.2013


Ответы (1)


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

Вот альтернатива.

Он использует Activator.CreateInstance для создания модулей и регистрации их в построителе.

Эта же структура также предоставляет вам бесплатную поддержку при регистрации конфигурации. Просто добавьте атрибут к своим услугам:

[Component]
public class MyService : IService
{
}

И запустите метод расширения построителя:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly());
person jgauffin    schedule 05.04.2012
comment
в вашей ссылке метод RegisterModules несколько длиннее, чем то, что я сделал бы, но вместо использования встроенной поддержки модулей autofac вы создаете свой собственный. - person cecilphillip; 06.04.2012