2010-04-12 4 views
2

J'ai une interface comme ceci:StructureMap - Scan - Interface générique avec la mise en œuvre de base et quelque chose de spécifique

interface IGenericSetupViewModel<T> 

J'ai alors implemtation par défaut de cela, quelque chose comme ça

class GenericSetupViewModel<T> : IGenericSetupViewModel<T> 

Pour certains classes spécifiques j'ai une implémentation spécifique comme ceci:

class ContractSetupViewModel : GenericSetupViewModel<Contract> 

Maintenant je veux ferai StructureMap retourner l'instance correcte, lorsque vous demandez un

ObjectFactory.GetInstance<GenericSetupViewModel<Contract>(); 

Je voudrais obtenir ContractSetupViewModel retourné, lorsque vous demandez quoi que ce soit d'autre, je voudrais obtenir une instance de

GenericSetupViewModel<T> 

J'ai essayé faire ceci:

 StructureMap.ObjectFactory.Configure(x => 
     { 
      x.Scan(y => 
      { 
       y.TheCallingAssembly(); 
       y.AddAllTypesOf(typeof(IGenericSetupViewModel<>)); 
       y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
      }); 
     }); 

Cependant il en résulte toujours me faire un GenericSetupViewModel et jamais ContractSetupViewModel. Je ne veux pas avoir à spécifier tous les viewmodels spécifiques donc est-ce que je peux obtenir cette analyse pour fonctionner?

+0

Avez-vous essayé ce qui se passe si vous demandez un 'IGenericSetupViewModel '? – flq

+0

Même chose que si je demande GenericSetupViewModel

Répondre

3

Il y avait un bug de courte durée dans StructureMap où ConnectImplementationToTypesClosing a eu du mal si votre type de fermeture spécifique n'a pas mis en œuvre l'interface directement. Une fois que vous obtenez la dernière version de StructureMap, le code suivant fonctionnera:

StructureMap.ObjectFactory.Configure(x => 
{ 
    x.Scan(y => 
    { 
     y.TheCallingAssembly(); 
     y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
    }); 
    x.For(typeof (IGenericSetupViewModel<>)).Use(typeof(GenericSetupViewModel<>)); 
}); 
+0

J'ai essayé de mettre à jour, mais cela ne fonctionne toujours pas. Le code ci-dessous me donne toujours un GenericSetupViewModel au lieu d'un ContractViewModel, en commentant comme indiqué, il ne peut rien résoudre. StructureMap.ObjectFactory.Configure (x => { x.Analyse (y => { ) y.TheCallingAssembly(); y.ConnectImplementationsToTypesClosing (typeof (IGenericSetupViewModel <>)); }); //x.Pour(typeof(IGenericSetupViewModel <>)). Utilisez (typeof (GenericSetupViewModel <>)); }); –

+1

Regardez le test suivant, qui passe avec le dernier StructureMap: http://github.com/structuremap/structuremap/blob/61c4b9b6d968b6bcce0e63fed5079902d0ab956e/Source/StructureMap.Testing/Bugs/CloseOpenGenericsWithSomeSpecifics.cs Pouvez-vous faire ce test n'a pas ? En quoi est-ce différent de votre exemple? Avez-vous un code d'enregistrement supplémentaire que vous ne montrez pas, qui pourrait potentiellement être en conflit? –

+0

J'ai trouvé le problème, pour que le scanner fonctionne les classes doivent être publiques, les miennes étaient privées. Merci –

0

Dans votre méthode GetInstance vous devriez faire quelque chose comme:

if (AnInstance is GenericSetupViewModel) 
    return AnInstance as GenericSetupViewModel; 
else if (AnInstance is ContractSetupViewModel) 
    return AnInstance as ContractSetupViewModel; 
+0

c'est exactement ce que je ne veux pas faire. –

+0

Ce n'est peut-être pas ce que vous voulez faire mais je ne vois pas d'autre moyen (du haut de ma tête). Vous devriez peut-être repenser votre conception si cela ne fonctionne pas. – James

0

Je ne suis pas trop familier avec StructureMap mais pourrait-il que vous séduise par priorité d'inscription?

Puisque vous appelez d'abord y.AddAllTypesOf(typeof(IGenericSetupViewModel<>));, cela enregistrera d'abord la classe générique opene GenericSetupViewModel<T>. Cet enregistrement répondra à votre demande de résolution pour GenericSetupViewModel<Contract> et l'enregistrement plus spécifique ContractSetupViewModel est ignoré. Cela dit, the Flattener sample indique clairement que l'enregistrement de type générique ouvert et les enregistrements de type générique fermé spécifiques devraient fonctionner. Pouvez-vous obtenir ce modèle pour travailler avec vos types?

Questions connexes