Использование Autofac в качестве локатора сервиса - PullRequest
14 голосов
/ 25 августа 2011

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

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

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

Ответы [ 3 ]

12 голосов
/ 25 августа 2011

Да, вы можете. Просто возьмите зависимость от 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.

1 голос
/ 26 августа 2011

Предположим, у вас есть два компонента, A и B.

Если A необходимо знать X о B перед его использованием, это запрос метаданных, и он описан в этом превосходном посте.

Более того, даже если вы не можете адаптировать свой дизайн к этому посту, вы должны снова попытаться убедиться, действительно ли вам нужно использовать DI-контейнер в качестве локатора службы.

На момент написания этой статьи лучший пост в блоге, который я мог найти, описывающий это это один.

0 голосов
/ 19 декабря 2012

В других случаях, когда ваш компонент не создается с помощью DI, вы все равно можете использовать шаблон поиска сервисов. Библиотека Common Service Locator на CodePlex идеально подходит для этой цели.

...