Подтвердить что ты не робот

Использование Autofac в качестве локатора сервисов

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

Обычно я просто хочу, чтобы эта ссылка на компонент Container была напрямую и решила все, что захочет. Однако класс, который создает экземпляр этого класса, не имеет ссылки на контейнер.

Фактически, мой компонент имеет зависимость от Autofac. Я предпочел бы более слабую связь, но, похоже, это не вариант. Есть ли способ спросить (в конструкторе args или с помощью вставки свойств или что угодно!) Autofac, чтобы дать мне ссылку на контейнер в моем конструкторе? Или, есть ли более чистый способ, чтобы Autofac предоставил мне волшебный объект локатора службы, который может разрешить что-либо?

4b9b3361

Ответ 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 идеально подходит для этой цели.