Как показывает ваш вопрос, имеет смысл делегировать ответственность за регистрацию сборке, которая знает, что нужно зарегистрировать. Например, если вы
используйте библиотеку SolrNet , она предоставляет метод, который выполняет регистрацию компонентов, чтобы инкапсулировать знания о том, что необходимо зарегистрировать, и избавить потребителя библиотеки от необходимости изучать все о библиотеке перед началом работы.
Однако при таком подходе существует потенциальная проблема. Изменились бы ваши требования к регистрации, если бы вы использовали зависимые сборки в других приложениях? Например, имеет ли смысл регистрировать что-то как ComponentLifeStyle.HttpRequestScoped
и затем использовать это в не-веб-приложении? Передавая регистрацию зависимости, вы связываете зависимость с требованиями регистрации ее потребителя (и с выбором контейнера IoC).
Autofac (я не могу говорить о других контейнерах IoC) предоставляет способ обойти это. Это позволяет вам переопределить регистрации, чтобы последний зарегистрированный компонент использовался при разрешении службы. Это означает, что вы можете вызвать метод регистрации библиотеки, а затем зарегистрировать свои собственные службы, чтобы переопределить значения по умолчанию.
Существует еще одна проблема с предложенной вами регистрацией на основе атрибутов - она не позволяет указать лямбда-выражение в качестве создателя компонента. Как бы вы реализовали такую регистрацию с атрибутами?
builder.Register(c => new A(c.Resolve<B>()));
Может быть предпочтительнее определить интерфейс IRegistrar
, а затем использовать отражение, чтобы искать во всех загруженных сборках реализации и вызывать их. Возможно, что-то вроде этого:
public interface IRegistrar
{
void RegisterComponents();
}