Come risolvere le istanze con i parametri del costruttore nel contenitore IOC personalizzato?
-
19-08-2019 - |
Domanda
Sto cercando di creare la mia inversione del contenitore di controllo. In questo momento conservo gli oggetti con i loro tipi in un dizionario e risolvo un riferimento quando richiesto. Ma voglio rendere possibile risolvere un riferimento o una nuova istanza. Posso creare una nuova istanza con la classe Activator. Ma cosa succede se il costruttore dell'oggetto da risolvere accetta 1, 2 o qualche parametro?
Ad esempio, voglio essere in grado di dire qualcosa del tipo:
Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));
e risolvilo come
IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();
dove MyFoo viene instanciato con il parametro specificato Proxy e MyBar con Proxy e DataThing .
Cosa deve fare risolvere per farlo accadere?
Soluzione 2
Ho deciso di dividerlo in metodi. Una risoluzione, che restituisce l'istanza memorizzata nel contenitore. E un Crea che istanzia una nuova istanza.
qualcosa del tipo:
public T Create<T>()
{
if (registeredTypes.ContainsKey(typeof(T)))
return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
GetType());
else
throw new DependencyResolverException("Can't
create type. Type " + typeof(T) + "
not found.");
}
Altri suggerimenti
Acquista http://funq.codeplex.com . Questo è un contenitore molto piccolo che usa espressioni lambda per definire la funzione da risolvere. Gestisce più parametri.
L'attivatore può creare un'istanza di una classe con costruttori con parametri.
Dai un'occhiata a questo sovraccarico del CreateInstance . / p>
Puoi fornire un raccoglitore personalizzato a cerca il costruttore corrispondente manualmente.
Nel tuo caso il metodo resol dovrebbe restituire il riferimento a un'istanza di classe registrata (nuovo Boo (Proxy, DataThing) nel tuo esempio)