2010-12-14 4 views
0

J'ai une interface qui prend un type génériqueproblème de résolution Unity lors de la configuration par XML avec le nom de dépendance enregistré

interface IIFace<T> 

Alors j'ai plusieurs implémentations

public class IFaceImp1 : IIFace<MyObj> {} 
public class IFaceImp2 : IIFace<MyObj> {} 

je définissais une viewmodel qui obtient injecté dans c'est un objet de cette interface pour un type spécifique ...

public MainViewModel(IIFace<MyObj> scrapper) { } 

Et puis je configurer l'unité pour le remplir

<containers> 
    <container> 
     <register type="IIFace[MyObj]" mapTo="IFaceImp1"> 
      <constructor> 
       <param name="loc" value="i am just a mock"> 
       </param> 
      </constructor> 
     </register> 
    </container> 
</containers> 

Cela fonctionne bien Le problème est, maintenant je voulais créer des enregistrements nommés, afin que je puisse les résoudre plus tard par son nom ... Donc, je l'ai appelé, et en a créé un autre en premier, mais ça n'a pas marché. Je réduit le problème à ceci:

<containers> 
    <container> 
     <register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation"> 
      <constructor> 
       <param name="loc" value="i am just a mock"> 
       </param> 
      </constructor> 
     </register> 
    </container> 
</containers> 

Ce qui ne fonctionne pas non plus ... wh en essayant de résoudre <> ("FirstImplementation"). Cependant, si je supprime l'attribut name et utilise la surcharge Resolve <>(), ça fonctionne bien .. Des idées sur ce qui pourrait arriver, qu'avoir un nom cela ne fonctionne pas?

+0

Je pense que le problème est que lorsqu'il n'y a pas de nom, en essayant d'instancier MainViewModel, Unity appelle le type enregistré par défaut dans le conteneur. Cependant, quand il a un nom, il n'y a aucun moyen de définir ce nom dans l'appel Register. Je pense que (peut-être que je me trompe) j'ai besoin de dire à l'unité d'une façon ou d'une autre qu'il y a une dépendance nommée à l'intérieur, mais je ne sais pas comment faire ça –

Répondre

0

Ok, j'ai découvert quel était le problème je avais besoin d'utiliser la balise, la construction de mon modèle d'objet dans le fichier XML le résultat final est quelque chose de similaire à ceci:

<containers> 
    <container> 

     <register type="ViewModelBase" mapTo="MainViewModel" name="MockMainViewModel"> 
      <constructor> 
      <param name="imp"> 
       <dependency name="FirstImplementation" /> 
      </param> 
      </constructor> 
     </register> 

     <register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation"> 
      <constructor> 
       <param name="loc" value="i am just a mock"> 
       </param> 
      </constructor> 
     </register> 
    </container> 
</containers> 

De cette façon, cette configuration dit à Unity de, lorsqu'il est appelé avec Resolve ("MockMainViewModel"), l'instancie et résout (via une dépendance aussi) le paramètre dont il a besoin dans son constructeur, avec le nom spécifié ("FirstImplementation") Je n'étais pas au courant de l'étiquette , mais de toute façon cela peut être utile à quelqu'un qui arrive avec le même problème et ne sait pas pourquoi la résolution ne fonctionne pas automatiquement, et ce qui est la bonne approche.

Questions connexes