Spring.NET - Как выбрать реализацию интерфейса во время выполнения? - PullRequest
1 голос
/ 25 марта 2010

Во всех примерах Spring.NET IoC я вижу что-то вроде этого:

 interface IClass;

 class ClassA : IClass;

 class ClassB : IClass, 

А затем в файле config.xml что-то вроде:

[object id="IClass" type="ClassB, Spring.Net.Test" /]

Но мне действительно нужно сделать что-то подобное в файле конфигурации, где будет несколько реализаций, если интерфейс:

[object id="IClass" type="ClassA, Blah" /]

[object id="IClass" type="ClassB, Blah" /]

А потом в _runtime_ я выбираю из них. Примерно так:

IClass c = [get me all implementations of IClass, and choose the one with 
            GetType().FullName == myVariableContainingFullTypeNameOfObjectIWant]

Как я могу сделать что-то подобное?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Я делал нечто подобное раньше и использовал подход, очень похожий на тот, который предложил Фабиано.

Пример конфигурации:

...

...

Теперь немного обобщенного примера кода с использованием WebApplicationContext:

        IApplicationContext context = new XmlApplicationContext(locations);
        IClass c = (IClass)context.GetObject(declarationId);

Следует отметить несколько вещей:

  1. Передайте id объявления, которое вы хотите использовать, а не Имя типа , поэтому переменная объявлениеId будет иметь значение либо "ClassAInstance" или "ClassBInstance".
  2. Конструктор для XmlApplicationContext (и WebApplicationContext) принимает параметр массива строковых значений; переменная location будет массивом ресурсов конфигурации для поиска, чтобы найти объект с идентификатором объявление ID . Вы не можете использовать универсальный список здесь, это должен быть фактический строковый массив.

Одним интересным следствием пункта 2 выше является то, что вы фактически контролируете, какие ресурсы конфигурации знает ваш ApplicationContext: когда вы вызываете метод GetObject (), ApplicationContext будет искать ваш объект только в пределах ресурсов конфигурации, указанных в массиве места [] . Это означает, что вместо перечисления всех возможных конфигураций в одном файле с уникальным идентификатором у вас может быть несколько ресурсов конфигурации, каждый из которых содержит одно объявление объекта и каждый с одинаковым идентификатором:

Config1.xml: ...

Config2.xml: ...

Но при создании экземпляра объекта вы можете контролировать, какой объект создается не на основе объявление ID , которое в обоих случаях будет "IClassInstance", но путем изменения местоположения [] массив для хранения ресурса конфигурации, который вы хотите использовать, в данном случае либо Config1.xml, либо Config2.xml

Надеюсь, что это полезно,

Andrew

0 голосов
/ 25 марта 2010

возможно, вы можете попробовать это:

[object id = "Blah.ClassA" type = "ClassA, Blah" /]

[object id = "Blah.ClassB" type = "ClassB, Blah" /]

IClass = (IClass) ApplicationContext.GetObject (myVariableContainedFullTypeNameOfObjectIWant);

...