10

Sto tentando di registrare un tipo generico in un file di configurazione per Unity 2.0 ma non riesco a farlo correttamente. Sono stato riferisco alla documentazione di MS qui: http://msdn.microsoft.com/en-us/library/ff660933%28v=PandP.20%29.aspx#_Generic_TypesUnity 2.0 che registra tipi generici via XML

Il codice è simile al seguente:

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

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

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

La configurazione XML che ho in questo momento loks in questo modo:

<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> 

Secondo il documentazione per registrare tipi generici si usano parentesi quadre attorno al tipo generico (s), e se il tipo non è un tipo di sistema si fornisce il tipo completo all'interno di più parentesi quadra. Che è quello che ho fatto, penso. Eppure - non funziona.

EDIT: Esempio dal sito MSDN:

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

L'errore generato è:

Il nome del tipo o alias IRepository non potevano essere risolti. Controlla il tuo file di configurazione e verifica il nome di questo tipo.

risposta

19

MSDN NON è sbagliato. Abbiamo aggiunto in modo specifico alcune regole di parsing di scorciatoie in modo che non sia necessario inserire tutte le parentesi quadre e quadrate nella maggior parte dei casi.

ho schiaffeggiato insieme un esempio che si presenta per lo più come la tua:

public interface IRepository<T> where T: class 
{ 

} 

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

} 

public class BlogRepository : GenericRepository<Blog> 
{ 

} 

public class Blog 
{ 

} 

mio config XML assomiglia a questo:

<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> 

e funziona solo.

Si è tentato in qualsiasi modo di utilizzare un alias per IRepository anziché la ricerca namespace/assembly? Ho ottenuto il seguente a lavorare come bene usando pseudonimi:

<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> 

Quando si specifica il tipo per un alias, è necessario utilizzare la sintassi tipo CLR. Ovunque sia possibile utilizzare la sintassi di scelta rapida generica.

+2

Il tuo ultimo commento è stato la soluzione al problema. Stavo cercando di usare la sintassi di scelta rapida negli alias. Grazie. – krisg

3

vi state perdendo un `carattere prima [[ (di seguito Esc sulla mia tastiera)

+1

la documentazione sul sito MSDN non specifica che sia necessaria. Vedi modifica sulla domanda originale. – krisg

+3

MSDN è sbagliato ... –

+0

Grazie. MSDN sbagliato - chi lo avrebbe fatto di thunk. – krisg

1

Penso che è necessario aggiungere` 1, come dimostrano gli esempi here on MSDN suggerirebbe:

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

Saluti che hanno fatto il trucco! – krisg