Autofac IOC - RegisterAssemblyTypes против RegisterType - PullRequest
0 голосов
/ 01 мая 2018

Я реализовал AutoFac после просмотра документации в моем приложении webapi2. Есть услуги по разной сборке проекта. Чтобы разрешить зависимости, я попробовал ниже три способа, которые все работали независимо. Хотя это работает, я чувствую, что у каждого свое применение. Как каждый обрабатывает мою зависимость и где это будет использоваться?

builder.RegisterType<TestManager>().AsImplementedInterfaces();//first way  
builder.RegisterAssemblyTypes(typeof(TestManager).Assembly).AsImplementedInterfaces();//second way  
builder.RegisterType<TestManager>().As<ITestManager>();//third way

1 Ответ

0 голосов
/ 01 мая 2018

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

Первый способ: явный регистр типа с неявными интерфейсами.

builder.RegisterType<TestManager>().AsImplementedInterfaces();//first way  

Плюсы:

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

Минусы:

  • Вам по-прежнему необходимо явно регистрировать свои типы и обновлять код автозапуска при добавлении / удалении типов (а не при добавлении / удалении интерфейсов). Итак: увеличено обслуживание по сравнению с (2), потому что вы должны зарегистрировать каждый тип.
  • Вы можете получить неожиданные побочные эффекты, если вы измените свой тип для реализации нового интерфейса, потому что без добавления чего-либо в регистр автозапуска он будет автоматически зарегистрирован.

Второй способ: зарегистрировать все типы в сборке без конкретного перечисления типов или интерфейсов.

builder.RegisterAssemblyTypes(typeof(TestManager).Assembly)
    .AsImplementedInterfaces();//second way  

Плюсы:

  • Хорошо подходит для простых приложений.
  • Очень удобно, если у вас в основном простая регистрация и вы не хотите выполнять много настроек в модулях автозапуска.
  • При добавлении / удалении типов или интерфейсов в сборке вам не нужно ничего добавлять к конфигурации автозапуска.
  • Основным преимуществом этого подхода является очень сокращенное обслуживание автофака по сравнению с двумя другими способами.

Минусы:

  • Частые побочные эффекты при добавлении / удалении типов в сборку, поскольку они автоматически регистрируются.
  • Становится более проблематичным, если вы регистрируете компоненты из нескольких сборок, используя этот подход.
  • Менее прозрачный: сложно узнать, зарегистрирован один компонент или нет, просто взглянув на код автофака.
  • Вы можете зарегистрировать вещи дважды, с разными конфигурациями. И помните, что порядок регистрации имеет значение.
  • Возможно, вы регистрируете много ненужных типов. Каждый публичный тип в сборке регистрируется. Если ваша сборка очень большая или вы собираетесь использовать только подмножество ее типов, тогда этот подход может быть не лучшим.

Третий способ: явная регистрация типа с явными интерфейсами.

builder.RegisterType<TestManager>().As<ITestManager>();//third way

Плюсы:

  • Лучшее управление, если ваш тип реализует несколько интерфейсов.
  • Обычно лучше подходит для более сложных регистраций в вашем коде автофака.
  • Предотвращает побочные эффекты при добавлении / удалении типов или интерфейсов в вашем коде, поскольку, если вы явно не измените свой код автозапуска, они не будут применены.
  • Итак: лучший контроль над тремя подходами и лучше подходит для сложных автофактурных регистраций.

Минусы:

  • Вам необходимо явно зарегистрировать каждый тип.
  • Этот подход требует большего обслуживания кода автофака. Обычно вы должны изменить это, когда вы меняете типы / интерфейсы в вашем коде. Итак: крупнейшее авто-кодовое обслуживание кода из трех способов.

Наверняка есть еще плюсы / минусы, которые я перечислил. Это были те, которые приходили мне в голову. Я думаю, что они могут быть хорошей отправной точкой для вас. Вы узнаете, какой из них вы предпочитаете, используя их в реальных сценариях.

Вы, вероятно, будете использовать некоторую комбинацию из трех способов. Общий подход заключается в использовании (2) в простых сценариях и добавлении определенных регистраций с помощью (1) или (3) для типов, которые требуют более сложных регистраций. Если ваши потребности в регистрации не так просты или у вас слишком большое приложение, я бы не рекомендовал использовать (2), так как может быть трудно узнать, что вы действительно регистрируете. И помните, что порядок регистрации имеет значение. Они накапливаются, и последний выигрывает. Поэтому, если вы собираетесь использовать (2) в сочетании с (1) или (3), вам следует сначала выполнить (2), а затем другие (в противном случае конкретные регистрации будут перезаписаны общими). ​​

...