2013-03-16 13 views
10

Supponiamo di avere un'interfaccia generica e un'implementazione generica. Come registro tutti gli usi?Come registrare un'interfaccia generica usando TinyIOC

In particolare, ho il seguente (ridotto per semplicità):

public interface IRepository<T> where T : TableEntity 
{ 
    T GetById(string partitionKey, string rowKey); 
    void Insert(T entity); 
    void Update(T entity); 
    void Update(string partitionKey, string rowKey, Action<T> updateAction); 
    void Delete(T entity); 
    IQueryable<T> Table { get; } 
} 


public class AzureRepository<T> : IRepository<T> where T : TableEntity 
{ 
    ... 
} 

Devo registrare tutte le implementazioni uno per uno, in questo modo:

container.Register<IRepository<Entity1>, AzureRepository<Entity1>>(); 
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>(); 
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>(); 
... 

o c'è un modo più breve ?

+1

È questo quello che stai cercando? https://github.com/grumpydev/TinyIoC/issues/8 –

+0

No - In questo esempio, registra tutte le dipendenze IRepository (IR , IR , ecc.) come AzureRepository . – seldary

+0

Posso confermare questo comportamento (in v1.2) - ma questo è chiaramente un bug. – TeaDrivenDev

risposta

10

Come menzionato nel mio commento, TinyIoC ha un bug nella risoluzione di Open Generics - non mantiene le istanze risolte con diversi parametri di tipo a parte, e come tutte le registrazioni sono implicitamente fatte con .AsSingleton() per impostazione predefinita, restituisce sempre la prima istanza del tipo generico che è stata risolta per tutte le successive richieste di risoluzione.

A causa di questo, il seguente non funziona:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)); 

c'è una soluzione, tuttavia - a rendere il transitorio di registrazione:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance(); 

questo creerà una nuova istanza per ogni risoluzione richiedere e onorare correttamente il parametro tipo. Lo svantaggio di questo è che si ottiene anche una nuova istanza ogni volta che si richiede l'interfaccia con un parametro di tipo che è stato precedentemente risolto.

Modifica

Confermato. La risoluzione Open Generics utilizza lo SingletonFactory che, una volta creata un'istanza, la restituirà sempre per le risoluzioni successive. Non sa o si preoccupa di Generics. Affinché funzioni correttamente, è necessario un GenericSingletonFactory che non mantenga solo una singola istanza ma un dizionario digitato dal tipo concreto da risolvere.

OK, non era nemmeno così difficile da risolvere. Semplicemente non ne capisco abbastanza per essere sicuro che sia davvero tutto corretto.

Problemi correlati