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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top