Unità 2.0 registrazione di tipi generici via XML

Sto cercando di registrare un generico tipo in un file di configurazione per l’Unità 2.0 ma non riesco a farlo bene. Ho parlato del MS documentazione qui : http://msdn.microsoft.com/en-us/library/ff660933%28v=PandP.20%29.aspx#_Generic_Types

Il codice simile a questo:

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

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

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

XML config che ho in questo momento loks come questo:

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

In base alla documentazione a registro generico tipi di uso di parentesi quadre intorno di tipo generico(s), e se il tipo non è un tipo di sistema è di fornire il tipo completo all’interno di più di parentesi quadre. Che è quello che ho fatto, credo. Ancora non funzionante.

MODIFICA: Esempio dal sito MSDN:

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

L’errore generato è:

Il tipo di nome o alias IRepository non può essere risolto. Si prega di controllare il file di configurazione e verificare questo tipo di nome.

InformationsquelleAutor krisg | 2010-08-15



3 Replies
  1. 19

    MSDN NON è sbagliato. Abbiamo appositamente aggiunto qualche collegamento regole di analisi, in modo che non è necessario inserire tutti i `s e tra parentesi quadre nella maggior parte dei casi.

    Ho schiaffeggiato insieme un esempio che appare 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
    {
    
    }

    La mia configurazione XML simile 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.

    Sono state per caso cercando di utilizzare un alias per IRepository invece dei nomi /assemblaggio di ricerca? Ho avuto le seguenti a lavoro, come pure l’uso di 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>

    Quando si specifica il tipo di un alias, si deve utilizzare il CLR tipo di sintassi. Ovunque è possibile utilizzare il generico sintassi.

    • Il tuo ultimo commento è stato che la soluzione del problema. Stavo cercando di utilizzare la sintassi in alias. Grazie.
  2. 3

    manca un ` personaggio prima di [[ (sotto Esc sulla tastiera)

    • la documentazione su MSDN sito non specifica che questa è necessaria. Vedere modifica sulla domanda originale.
    • MSDN è sbagliato…
    • Grazie. MSDN sbagliato – che avrebbe detto.
  3. 1

    Penso che avete bisogno di aggiungere `1, come esempi qui su MSDN suggerirei:

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

Lascia un commento