10

J'essaie d'enregistrer un type générique dans un fichier de configuration pour Unity 2.0 mais je n'arrive pas à le comprendre correctement. J'ai fait référence à la documentation de MS ici: http://msdn.microsoft.com/en-us/library/ff660933%28v=PandP.20%29.aspx#_Generic_TypesUnity 2.0 enregistrement des types génériques via XML

Le code ressemble à ceci:

public interface IRepository<T> where T : class 
{ 
    ... 
} 

public class GenericRepository<T> : IRepository<T> where T : class 
{ 
    ... 
} 

public class BlogRepository : GenericRepository<BlogRepository> 
{ 
    ... 
} 

La configuration XML j'ai au moment loks comme ceci:

<unity> 
    <!-- Aliases --> 
    <alias alias="BlogIRepository" 
      type="X.Services.Interfaces.IRepository[[X.Domain.Entities.Blog, X.Domain]], X.Services"/> 

    <alias alias="BlogRepository" 
      type="X.Repositories.BlogRepository, X.Repositories"/> 

    <!-- Type registration --> 
    <container name="development"> 
     <!-- Common connection string value --> 
     <instance name="Conn" type="System.String" value="blahblahblah"/> 
     <register type="BlogIRepository" mapTo="BlogRepository"> 
      <constructor> 
       <param name="connectionString" type="System.String" dependencyName="Conn"/> 
      </constructor> 
     </register> 
    </container> 
</unity> 

Selon le documentation pour enregistrer les types génériques vous utilisez des crochets autour du ou des types génériques, et si le type n'est pas un type de système, vous fournissez le type entièrement qualifié à l'intérieur d'un crochet plus carré. C'est ce que j'ai fait, je pense. Pourtant - pas de travail.

EDIT: Exemple à partir du site MSDN:

<register type="IDictionary[string, [MyApp.Interfaces.ILogger, MyApp]]"/> 

L'erreur générée est:

Le nom du type ou pseudonyme IRepository n'a pas pu être résolus. Veuillez vérifier votre fichier de configuration et vérifier ce nom de type.

Répondre

19

MSDN n'est pas faux. Nous avons spécifiquement ajouté des règles d'analyse des raccourcis afin que vous n'ayez pas à entrer tous les crochets et les crochets dans la plupart des cas.

Je giflé ensemble un exemple qui ressemble la plupart du temps comme la vôtre:

public interface IRepository<T> where T: class 
{ 

} 

public class GenericRepository<T> : IRepository<T> where T : class 
{ 

} 

public class BlogRepository : GenericRepository<Blog> 
{ 

} 

public class Blog 
{ 

} 

Ma configuration XML ressemble à ceci:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
    <namespace name="UnityConfigExample"/> 
    <assembly name="UnityConfigExample"/> 

    <container> 
     <register type="IRepository[]" mapTo="GenericRepository[]" /> 
     <register type="IRepository[Blog]" mapTo="BlogRepository" /> 
    </container> 
    </unity> 

et ça marche.

Étiez-vous par hasard en train d'essayer d'utiliser un alias pour IRepository au lieu de la recherche d'espace de noms/d'assembly? Je suis arrivé ce qui suit pour travailler aussi bien en utilisant des alias:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
    <alias alias="IRepository" type="UnityConfigExample.IRepository`1, UnityConfigExample" /> 
    <alias alias="GenericRepository" type="UnityConfigExample.GenericRepository`1, UnityConfigExample"/> 
    <alias alias="BlogRepository" type="UnityConfigExample.BlogRepository, UnityConfigExample"/> 
    <alias alias="Blog" type="UnityConfigExample.BlogRepository, UnityConfigExample"/> 

    <container> 
     <register type="IRepository[]" mapTo="GenericRepository[]" /> 
     <register type="IRepository[Blog]" mapTo="BlogRepository" /> 
    </container> 
    </unity> 

Lorsque vous spécifiez le type d'un alias, vous devez utiliser la syntaxe de type CLR. Partout ailleurs, vous pouvez utiliser la syntaxe du raccourci générique.

+2

Votre dernier commentaire était les solutions à ce problème. J'essayais d'utiliser la syntaxe du raccourci dans les alias. Merci. – krisg

3

vous manque un caractère `avant [[ (ci-dessous Esc sur mon clavier)

+1

La documentation sur le site MSDN ne spécifie pas que cela est requis. Voir modifier sur la question originale. – krisg

+3

MSDN est faux ... –

+0

Merci. MSDN faux - qui serait de thunk. – krisg

1

Je pense que vous devez ajouter` 1, comme les exemples here on MSDN suggérerait:

type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services" 
+0

Cheers qui a fait l'affaire! – krisg