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

Можно лениво разрешить компонент в 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 в разрешении вызова?

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

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

1 ответ

Решение

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

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

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