Лучшие практики для регистрации контейнеров?

Кажется, есть два варианта регистрации ваших классов в контейнере: явная (RegisterType().As) или автоматическая проводка (RegisterAssemblyTypes()). Оба, кажется, имеют довольно существенные недостатки.

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

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

Существует ли передовая практика, которая делает регистрацию менее болезненной/рискованной?

Привет Мэтт


person citizenmatt    schedule 11.11.2010    source источник
comment
Действительно хороший, хорошо заданный вопрос. Спасибо.   -  person Nick Hodges    schedule 30.06.2011


Ответы (2)


Возможно, золотая середина состоит в том, чтобы добавить атрибут к классам, которые должны быть зарегистрированы. Этот атрибут может принимать параметры, чтобы указать, как он регистрируется, например, время жизни компонента.

Это не сложно реализовать самостоятельно. Если вы это сделаете, у вас все еще есть основная функция регистрации, но ей нужно знать только, какие атрибуты искать (и какие библиотеки DLL искать), а не каждый компонент.

person Frank Schwieterman    schedule 11.11.2010
comment
Хороший ответ. Это можно сделать довольно просто, используя методы Where() и As(), следующие за RegisterAssemblyTypes(), или используя библиотеку AutofacContrib.Attributed. У этого подхода тоже есть свои недостатки (как и у всех), поскольку он не поощряет использование нескольких конфигураций одного и того же компонента в одном приложении. - person Nicholas Blumhardt; 12.11.2010
comment
Мне нравится это предложение, но я немного удивлен, что оно не является чем-то более предписывающим. Как большинство людей делают регистрацию? Как сбалансировать недостатки каждого подхода? - person citizenmatt; 12.11.2010
comment
Я действительно не знаю, что делает большинство людей. Сначала я начал использовать атрибуты, потому что это имело для меня смысл, но только позже я обнаружил людей, использующих основную функцию регистрации (это юк) или автопривязку (что не кажется мне достаточно явным). - person Frank Schwieterman; 12.11.2010

Вы изучали использование поддержки модуляции Autofac?

В вашем загрузчике или где бы вы ни собирали свой контейнер, вы просто регистрируете модули в своем приложении, а затем в каждом модуле вы регистрируете свои типы. Это значительно облегчает чтение и понимание.

person Mark    schedule 09.12.2010
comment
Я считаю использование модулей хорошим решением для решения сложных задач. Один модуль на сборку и один модуль в приложении, который извлекает все необходимые модули сборки. Внутри каждого модуля можно использовать либо явную регистрацию, либо регистрацию по соглашению, в зависимости от того, что лучше всего подходит для этой конкретной сборки. - person Peter Lillevold; 03.01.2011