Автоматическое ленивое разрешение компонентов в Castle Windsor

Можно лениво разрешить компонент в Castle Windsor, зарегистрировав LazyOfTComponentLoader в контейнере и разрешив Lazy<T>, как указано здесь:

container.Register(
   Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>(),
   Component.For<ISomeService>().ImplementedBy<ServiceImpl>().LifestyleTransient()
   );

var lazy = container.Resolve<Lazy<ISomeService>>();

lazy.Value.DoSomething();

Однако можно ли зарегистрировать компонент в контейнере, чтобы он всегда разрешался как Lazy<T> без необходимости указывать Lazy в вызове разрешения?

В частности, мне интересно, как внедрять ленивые компоненты в контроллеры в проекте MVC при использовании внедрения конструктора.

РЕДАКТИРОВАТЬ: вы можете указать Lazy<ISomeService> someService в качестве параметра в конструкторе контроллера, как можно увидеть здесь. Однако есть ли способ гарантировать, что компонент будет отложен в процессе регистрации?




Ответы (1)


Если вы хотите разрешить ленивый загруженный экземпляр компонента, вам нужно будет сделать Resolve<Lazy<ISomeService>>(). Функция lazy.Value будет выполнять фактическое разрешение компонента. Если вы примете решение, вы получите свой компонент напрямую.

Если вы действительно хотите иметь компонент, который разрешается только при первом использовании без использования Lazy, вы можете прибегнуть к написанию перехватчика.

Удачи, Марвейн.

person Marwijn    schedule 18.03.2013