2010-11-23 21 views
1

je dois faire ce qui suit:StructureMap Ouvrez génériques les instances nommées

var someType = ObjectFactory.GetNamedInstance("myNamedInstance"); 

où UnType peut être une mise en œuvre de ICommand.

donc j'enregistré certains d'entre eux:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1"); 
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2"); 

est-il un moyen de le faire dans StructureMap, car GetNamedInstance nécessite le paramètre de type que je don3t savoir jusqu'à l'exécution.?

Répondre

2

(Pour cela, je suppose que vous créé ICommand<T>)

Cela ne fait pas vraiment de sens ... penser à la ligne:

//where aString is either myNamedInstance1 or myNamedInstance2 
var someType = ObjectFactory.GetNamedInstance(aString); 

Supposons maintenant que vous êtes ne va pas utiliser var, et à la place le type réel. Que mettriez-vous là-bas qui pourrait compiler? Autrement dit, quel type peut someType peut-être autre que object?

Aussi, rappelez-vous que ICommand<string> et ICommand<int> sont les deux types construits à partir ICommand<T>, mais ne sont pas liés par ailleurs - ils ont aucun type de base commune autre que object.

Si vous n'avez pas le type avant l'exécution, les génériques ne vont pas aider beaucoup - faites plutôt en sorte que votre ICommand<T> hérite d'une interface commune - comme ICommandBase - qui a les méthodes dont vous avez réellement besoin.

Cependant, si vous ne savez pas le type dans cette méthode, vous pouvez pousser l'inconnu « vers le haut » dans la compilation en faisant la méthode contenant ce générique:

public void Execute<T>(string commandName) 
{   
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName); 
    someType.Execute(); 
} 

Maintenant l'appelant d'exécuter a besoin du type param ... mais encore une fois vous pourriez pousser cela. Notez que vous aurez éventuellement besoin du paramètre type.

+0

merci pour votre réponse – Luka