2010-03-25 15 views
1

Dans tous les exemples de Spring.NET IoC, je vois quelque chose comme ceci:Spring.NET - Comment choisir l'implémentation d'une interface lors de l'exécution?

interface IClass; 

class ClassA : IClass; 

class ClassB : IClass, 

Et puis dans le fichier config.xml, quelque chose comme:

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

Mais je dois vraiment faire quelque chose comme ça dans le fichier de configuration où il y aura plusieurs implémentations si l'interface:

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

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

Et puis dans _runtime_ je choisis d'eux. Quelque chose comme ceci:

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

Comment puis-je faire quelque chose comme ça?

Merci beaucoup!

Répondre

0

vous pourriez peut-être essayer ceci:

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

[id = objet de type "Blah.ClassB" = "ClassB, Blah "/]

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

1

J'ai fait quelque chose de similaire auparavant et j'ai adopté une approche très similaire à celle proposée par Fabiano.

configuration de l'échantillon:

< object id = type "ClassAInstance" = "ClassA, bla" > ... </objet >

< id object = type "ClassBInstance" = "ClassB, bla "> ... </objet >

maintenant un code généralisé de l'échantillon à l'aide du WebApplicationContext:

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

Il y a deux ou trois choses à noter:

  1. passe dans le id de la déclaration que vous souhaitez pas utiliser le nom du type , donc la variable declarationId aurait la valeur de soit "ClassAInstance" ou "ClassBInstance".
  2. Le constructeur de XmlApplicationContext (et WebApplicationContext) prend un paramètre d'un tableau de valeurs de chaîne; la variable emplacements constituerait un tableau de ressources de configuration à rechercher pour trouver l'objet avec l'ID declarationId. Vous ne pouvez pas utiliser une liste générique ici, il doit s'agir d'un tableau de chaînes réel.

Une implication intéressante du point 2 ci-dessus est que vous contrôlez réellement quelles ressources la configuration de votre ApplicationContext est au courant: lorsque vous appelez la méthode GetObject(), le ApplicationContext ne rechercher votre objet dans les ressources de configuration données dans le tableau emplacements []. Cela signifie qu'au lieu de lister toutes les configurations possibles dans un fichier avec un identifiant unique, vous pouvez avoir plusieurs ressources de configuration, chacune contenant une déclaration d'objet et chacune avec le même ID:

Config1.xml: < object id = type "IClassInstance" = "ClassA, Blah" > ... </objet >

Config2.xml: < object id = type "IClassInstance" = "ClassA, Blah" > ... </objet >

Mais lors de l'instanciation de l'objet, vous pouvez contrôler Cet objet est créé non basé sur le declarationId, qui dans les deux cas sera "IClassInstance", mais en modifiant le tableau locations [] pour contenir la ressource de configuration que vous souhaitez utiliser, dans ce cas soit Config1.xml ou Config2.xml

Espérons que cela est d'usage,

Andrew