Каков предложенный метод получения контейнера Autofac внутри класса в приложении? Предоставляет ли Autofac разрешение для разрешения свойства IContainer в классе или мне нужно хранить контейнер глобально после его создания?
Решение IContainer
Ответ 1
Для большинства целей вам понадобится IComponentContext
или ILifetimeScope
. Они автоматически предоставляются Autofac, поэтому все, что вам нужно сделать, это взять зависимость (конструктор) от одного из них и вставить текущий экземпляр.
Оба интерфейса предоставляют стандартные операции Resolve()
, а ILifetimeScope
extends IComponentContext
путем добавления методов для запуска новых вложенных времен жизни.
Компоненты, которые хотят использовать службы контейнера для доступа к другим компонентам, должны делать это в своей собственной области, а не в "глобальном" IContainer
, чтобы верный экземпляр мог быть возвращен. Например. в запросе HTTP введенный IComponentContext
или ILifetimeScope
будет тем, который будет использоваться для текущего запроса.
Большинство проблем, требующих инъецированного контекста, также могут быть (часто более элегантно) преодолены с помощью типов отношений - см.: http://autofac.readthedocs.org/en/latest/resolve/relationships.html.