Использование Autofac в качестве локатора сервисов
Я использую Autofac для обработки инъекции зависимостей в моем приложении. Тем не менее, у меня есть один компонент, который делает некоторую магию отражения во время выполнения, и во время компиляции я не знаю, какие зависимости ему понадобятся.
Обычно я просто хочу, чтобы эта ссылка на компонент Container была напрямую и решила все, что захочет. Однако класс, который создает экземпляр этого класса, не имеет ссылки на контейнер.
Фактически, мой компонент имеет зависимость от Autofac. Я предпочел бы более слабую связь, но, похоже, это не вариант. Есть ли способ спросить (в конструкторе args или с помощью вставки свойств или что угодно!) Autofac, чтобы дать мне ссылку на контейнер в моем конструкторе? Или, есть ли более чистый способ, чтобы Autofac предоставил мне волшебный объект локатора службы, который может разрешить что-либо?
Ответы
Ответ 1
Да, вы можете. Просто возьмите зависимость от IComponentContext
:
public class MyComponent
{
IComponentContext _context;
public MyComponent(IComponentContext context)
{
_context = context;
}
public void DoStuff()
{
var service = _context.Resolve(...);
}
}
Обновление из комментариев: IComponentContext
, введенный в MyComponent
, зависит от области, из которой было разрешено MyComponent
. Поэтому важно рассмотреть вопрос о том, какая область охвата времени MyComponent
зарегистрирована. Например. используя InstancePerLifetimeScope
, контекст всегда будет разрешен к той же области, в которой живет служба в зависимости от MyComponent
.
Ответ 2
Предположим, что у вас есть две компоненты: A и B.
Если A должен знать X о B перед его использованием, это запрос Metadata, и он описан в этой отличной публикации.
Кроме того, даже если вы не можете адаптировать свой дизайн к этому сообщению, вы должны снова попытаться убедиться, что вам действительно нужно использовать свой контейнер DI как локатор сервисов.
Во время этого написания, лучший пост в блоге, который я мог бы описать, this one.
Ответ 3
В других случаях, когда ваш компонент не создан с помощью DI, вы все равно можете использовать шаблон локатора службы. Библиотека Common Service Locator на CodePlex идеально подходит для этой цели.