Замок ResolveAll возвращает пустой массив - PullRequest
3 голосов
/ 02 февраля 2012

Вот как выглядит моя сборка (TestAssembly)

Class BaseClass
{
....
....
}

Interface I1
{
....
....
}

Interface I2 : I1
{
....
....
}
Interface I3 : I1
{
....
....
}
Class A : BaseClass, I2
{
....
....
}

Class B : BaseClass, I3
{
....
....
}

Я использую Castle Windsor для регистрации и разрешения всех этих компонентов.

container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
                            .BasedOn<I1>()
                            .LifestyleSingleton());

Вниз я пытаюсь разрешить все типы I1 (интерфейс I1), используя

container.ResolveAll<I1>();

в надежде получить массив объектов A и B. Вместо этого я получаю пустой массив. Что не так?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Полагаю, вам нужно указать контейнеру, какие сервисы ассоциировать с интерфейсом, например:

1 голос
/ 02 февраля 2012

Я, кажется, нашел ответы на свои вопросы (см. Мои комментарии к ответу Ханса Джонуса).

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

Используя пример, упомянутый в вопросе:

container.Register(Classes.FromAssemblyNamed("TestAssembly")
                   .BasedOn<I1>()
                   .WithService.FirstInterface());  

Это позволяет вам разрешать определенные экземпляры классов A и B, используя

I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();

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

container.Register(Classes.FromAssemblyNamed("TestAssembly")
                   .BasedOn<I1>()
                   .WithService.AllInterfaces()
                   );

Таким образом, вы можете делать все, что хотите, я имею в виду.

I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();
I1[] ObjArray = container.ResolveAll<I1>();

Но это увеличивает размер контейнера.Я не уверен, как это влияет на производительность.Я опубликую свои выводы, как я выясняю.Я ценю любые комментарии по этому вопросу.Благодаря.

...