Замок Виндзорский завод слабых машин - PullRequest
1 голос
/ 09 января 2011

В очень ограниченном числе сценариев мне нужно перейти от неизвестного типа (во время компиляции) к экземпляру объекта, зарегистрированного для этого типа.

По большей части я использую фабрики с типизацией и знаю тип, который хочу разрешить во время компиляции ... поэтому я вставляю Func<IMyType> в конструктор

... нов этом ограниченном числе сценариев, чтобы избежать прямого вызова контейнера (и, следовательно, необходимости ссылаться на Виндзор из библиотеки, что является анти-паттерном, которого я хотел бы избежать), мне нужно ввести Func<Type,object>... который я хочу внутренне контейнером. Разрешить (тип) для параметра Type в Func.

У кого-нибудь есть предложения по простейшему / наиболее простому способу его настройки?

Я попробовал следующее, но с этой настройкой я в итоге обошел обычную TypedFactoryFacility, что определенно не то, что я хочу:

Kernel.Register(Component.For(typeof (Func<Type, object>)).LifeStyle.Singleton.UsingFactoryMethod(
                    (kernel, componentModel, creationContext) => 
                        kernel.Resolve(/* not sure what to put here... */)));

Заранее благодарен за любую помощь.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Это легко, если вы помните, что вы можете зарегистрировать делегатов в Windsor как обычные компоненты:

container.Register(Component.For<Func<Type,object>>()
   .Instance(t=>container.Resolve(t)));

Вы также можете сделать это с помощью типизированной фабрики (это рекомендуемый подход, если вы планируете разрешать переходные компоненты с помощьюэта фабрика, так как печатная фабрика дает вам область видимости) и пользовательский селектор .

    container.Register(
         Component.For<YourSelector>(),
         Component.For<Func<Type,object>>().Lifestyle.Transient
             .AsFactory(x=>x.SelectedWith<YourSelector>());
0 голосов
/ 09 января 2011

Я думаю, что вы можете использовать общий сервисный локатор для этого http://commonservicelocator.codeplex.com/,, который, я думаю, Айенде написал поддержку Castle Windsor для http://ayende.com/blog/archive/2008/10/02/the-common-service-locator-library.aspx. Он в основном предоставляет способ разрешения зависимости без зависимости на конкретный контейнер (например, Виндзор / Ninject и т. д.). В конечном итоге вы зависите от общего локатора службы на том уровне, для которого вы решаете, но, по крайней мере, вы можете поменяться, например. Виндзор для Ninject на уровне приложения, чтобы его можно было использовать в различных проектах.

Для инициализации:

ServiceLocator.SetLocatorProvider(() => { return new WindsorServiceLocator(_container); });

где _container - ваш IWindsorContainer, а затем для разрешения зависимостей:

ServiceLocator.Current.GetInstance<MyType>();

или

ServiceLocator.Current.GetAllInstances<MyType>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...