L'applicazione sto lavorando si basa su Autofac come DI contenitore e uno dei motivi che mi ha fatto decidere di usarlo, tra gli altri, è stata la caratteristica delegato di fabbrica (vedi here)Service Locator più facile da usare dell'iniezione di dipendenza?
Questo funziona bene per tutti i casi dove ho bisogno di ricreare gli stessi elementi più volte, come nel caso di alcuni report e schermate correlate. Alcuni report (anche quelli dello stesso tipo) vengono eseguiti contemporaneamente ma cambiano solo in base ai parametri definiti dall'utente, quindi ha senso (credo) inserire le factory per creare istanze, passare i parametri liberi e lasciare il resto al applicazione.
Il problema deriva dal fatto che ogni rapporto è composto da un numero variabile di sottoreti (attività) e ogni attività implementa un'interfaccia ITask. Ogni report può avere fino a 50 diverse attività da utilizzare e ogni attività incapsula un'operazione di business precisa. Una delle opzioni che ho è di iniettare le fabbriche delegate e crearle quando necessario.
Questi compiti devono essere dinamicamente generati dalle fabbriche e qualcosa come:
var myTaskA = _taskFactoryConcreteTaskA();
var myTaskB = _taskFactoryConcreteTaskB();
var myTaskC = _taskFactoryConcreteTaskC();
...
var myTaskZZ = = _taskFactoryConcreteTaskZZ();
richiede un sacco di cablaggio manuale (delegati, il costruttore, il backup campi ecc), mentre qualcosa come
var myTaskA = _taskFactory.Create<ConcreteTaskA>();
var myTaskB = _taskFactory.Create<ConcreteTaskB>();
var myTaskC = _taskFactory.Create<ConcreteTaskC>();
...
var myTaskZZ = _taskFactory.Create<ConcreteTaskZZ>();
sarebbe essere incredibilmente meno lavoro, specialmente se la _taskFactory esegue il wrapping del contenitore come mostrato in this other post, ma fondamentalmente significa che sto usando un localizzatore di servizi per creare i miei compiti.
Quali altre opzioni sono disponibili per risolvere questo problema?
(NOTA: c'è una buona probabilità Sono completamente fuori pista e che devo leggere molto di più su DI, nel qual caso qualsiasi contributo sarebbe ancora più importante)
Martin Fowler ha scritto su questo un po ': http://martinfowler.com/articles/injection.html#UsingAServiceLocator – mwilson
Grazie, questo è ciò che mi ha fatto ripensare a tale proposito l'articolo molto: http: //blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx (e mi ha convinto ad acquistare il libro, comunque lo sto aspettando) – mhttk