2011-01-05 4 views
56

Что такое предлагаемый метод получения контейнера Autofac изнутри класса в приложении? Предоставляет ли Autofac разрешение для разрешения свойства IContainer в классе или мне нужно хранить контейнер глобально после его сборки?Resolve IContainer

ответ

88

Для большинства целей вам понадобится IComponentContext или ILifetimeScope. Они автоматически предоставляются Autofac, поэтому все, что вам нужно сделать, это принять (конструктор) зависимость от одного из них, а текущий экземпляр будет введен.

Оба интерфейса обеспечивают стандартные операции Resolve(), а ILifetimeScope расширяет IComponentContext, добавляя методы для запуска новых вложенных времен жизни.

Компоненты, которые хотят использовать услуги контейнера для доступа к другим компонентам, должны делать это в своей области, а не в глобальном IContainer, чтобы можно было вернуть правильный экземпляр. Например. в запросе HTTP введенный код IComponentContext или ILifetimeScope будет единственным для текущего запроса.

Большинство проблем, требующих инъецированного контекста, также могут быть (часто более элегантно) преодолены с использованием видов отношений - см .: http://autofac.readthedocs.org/en/latest/resolve/relationships.html.

+1

Было бы неплохо отметить, что существует разница между автоматической проводкой этого класса и его созданием с использованием делегата. В моем случае следующее работало: 'builder.RegisterType ()', в то время как при вызове объекта ObjectDisposedException при запуске 'IComponentContext' вызывается следующее:' builder.Register (c => new QueryProcessor (c)) ' , – Steven

+9

'builder.Register (c => новый QueryProcessor (c))' должен быть: 'builder.Register (c => новый QueryProcessor (c.Resolve ()))' - 'c' является временным, живет на основе операции. НТН! –