Sto provando con Ninject e sto modificando il codice che ho scritto con Structure Map per vedere quanto sia facile. In questo codice base ho un grafico di oggetti che hanno diverse configurazioni tramite i registri della mappa della struttura e quello da utilizzare viene scelto in fase di esecuzione tramite un valore nel database (in questo caso per ritirare un corpo del servizio wcf con alcuni oggetti iniettati) . Ad esempio, utilizzando il codice Mappa struttura:Utilizzo dei nomi per discriminare le istanze utilizzando IoC
Il Registro di sistema 1 imposta tutti i valori predefiniti per i tipi IBusinessContext, IRules e ILogger. Questo è solo aggiungendo i tipi GenericContext/Logger/Rules a fianco delle interfacce senza altre specializzazioni.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
Registro 2 set fino IBusinessContext utilizzare la classe SpecialisedContext e dice al ctor di utilizzare SpecializedLogger. L'istanza di IBusinessContext è denominata "SpecializedContext".
Questo funziona come previsto in Mappa struttura (in base alla sintassi vecchia o nuova).
Tuttavia, quando ho utilizzato Ninject ho riscontrato un problema con l'attesa che l'istanza senza nome fosse predefinita (non come funziona Ninject, ma ho capito). Ciò ha portato ad alcune ricerche che hanno tutte suggerito che l'uso di istanze nominate è un'idea veramente cattiva. Capisco che ci sono modi migliori per farlo usando la registrazione automatica o gli attributi per impostare un nome o richiedere un determinato tipo, ma nel sistema che sto descrivendo deve esserci un modo in fase di esecuzione per capire quale configurazione chiedere nella parte superiore dell'albero (e lasciare che la struttura IoC calcoli il resto in base a tipi o regole registrati).
Quindi ... sto semplicemente usando il concetto IoC sbagliato qui aspettandomi di chiedere il mio oggetto di alto livello per nome o c'è generalmente un modo migliore di fare quello che sto cercando di fare? Dovrei usare qualcosa come MEF e trattare tutto questo come plug-in?
Sottolineo che non sto usando questo come una fabbrica stupida e chiedendo ad ogni livello del codice un'istanza di tipo x dal contenitore, è solo l'azione di avvio.
Grazie in anticipo per il vostro tempo e aiuto :)
Grazie Aaron! Questo ha chiarito alcune cose per me :) È molto apprezzato. – NoodleAwa