2009-07-13 16 views
7

Ho creato un'interfaccia ISearchable che ho digitato in modo da poter recuperare un IEnumerable di T per i risultati.Unity Container: passaggio in T dinamicamente al metodo Resolve

Ho un certo numero di servizi che implementano ISearchable per i diversi oggetti di dominio ...

Container.RegisterType<ISearchable<Animal>, AnimalService>(); 
Container.RegisterType<ISearchable<Fish>, FishService>(); 

voglio risolvere (tramite l'Unità) un ISearchable in base al tipo, ma sto lottando per farlo funzionare ...

Quanto segue non compila, ma si spera che dia un'idea di cosa sto cercando di ottenere.

Type t = typeof(Animal); 
var searchProvider = _container.Resolve<ISearchable<t>>(); 

Qualsiasi aiuto ricevuto con gratitudine!

Grazie,

Andy

risposta

12

Infine l'ho ordinato, speriamo che sia di aiuto a qualcun altro!

var type = filter.GetType(); 
var genericType = typeof(ISearchable<>).MakeGenericType(type); 
var searchProvider = _unityContainer.Resolve(genericType); 
0

ne dite ...

var sp = container.Resolve(
Type.GetType("ISearchable`1[" + yourGenericTypeHere + "]")); 
+0

Grazie per questo Dmitri, anche se spero in una soluzione fortemente tipizzata - se ce n'è uno là fuori! :) –

2

Perché non registrare i tipi in base al nome e risolvere in questo modo?

Container.RegisterType<ITelescopeView, TelescopeView>("type1"); 
Container.RegisterType<ITelescopeView, TelescopeView2>("type2"); 

Container.Resolve(ITelescopeView, "type1"); 

Se volete che i vostri nomi possono essere semplicemente il nome completo del tipo o si potrebbe usare qualcosa di diverso. Anche l'approccio di Dmitri funzionerà. Ma questo potrebbe risultare in un codice più chiaro.

+0

Ma avrei ancora bisogno di ottenere T in modo dinamico nel metodo di risoluzione ... –

Problemi correlati