Sto cercando di migliorare i miei progetti MVC e ho letto alcuni articoli su DI, contenitori IoC, Iniezione del costruttore e locatori di servizi. Volevo andare con Ninject per aiutare con le dipendenze, ma sono rimasto perplesso con alcune delle cose che ho letto.
Il più controverso sarebbe quello ampiamente discusso qui link (entrambe le parti).
E poi alcune risposte ad esso, come la risposta di Mark Seemann , e un follow up
Jeffrey espone le mie paure e le affronta in modo scorretto - tuttavia, non sono sicuro di cosa fare nel mio caso.
Ad esempio, vediamo un controller MVC. Funge da livello di comunicazione tra un'app MCV e una WebAPI. Sono un po 'concentrato sul numero di dipendenze che avrei dovuto fare con Constructor Injection.
public class OcrController : ConnectorControllerBase, IOcrController
{
private readonly ILogger logger;
private readonly IConnectorConfigurator config;
private readonly HttpClient client;
private readonly IOcrConnector connector;
public OcrController(
ILogger logger,
IConnectorConfigurator config,
HttpClient client,
IOcrConnector connector)
{
this.logger = logger;
this.config = config;
this.client = client;
this.connector = connector;
}
}
Mentre IOcrConnector e HttpClient sono chiare dipendenze da cui non ho problemi, sono preoccupato per gli altri due. A seconda di un'azione, richiede un IConfiguration per leggere qualcosa dalla config e in alcuni casi potrebbe essere necessario un Logger.
Lo stesso sarebbe vero per molte delle mie classi - una o due dipendenze reali, e il logger e la configurazione e forse qualcos'altro in futuro.
Al momento sto utilizzando un ServiceLocator semplice e scarso, in cui invece di passare a ILOT e IConfig, li creo quando necessario:
protected ILogger Logger => this.logger
?? (this.logger = ComponentFactory.GetLogger(this.GetType()));
protected IConnectorConfigurator Config => this.config
?? (this.config = ComponentFactory.GetConfig());
Il 'Factory' è molto semplice, perché restituisce semplicemente il mio wrapper di ILogger come di seguito:
public static ILogger GetLogger(Type type)
{
return new Log4NetLogger(type);
}
Questa fabbrica vive in un assemblaggio separato, quindi mi sembra che disaccordi sufficientemente il concreto ILogger dai progetti attuali ...?
Non ho intenzione di scambiare ILogger o IConfig (che ora è solo un wrapper per ConfigurationManager integrato) in fase di esecuzione o qualsiasi altra cosa, ma quando / se si presenta la necessità, cambierei semplicemente il tipo restituito da GetLogger (Tipo di tipo); metodo.
Quindi, fatemi sapere se questo tipo di mix di DI e ServiceLocator appropriati ha senso? Un'altra alternativa che penso potrebbe essere passare un IComponentFactory nel costruttore (invece di avere una statica globalmente accessibile?) Ma questo è ancora un localizzatore di servizi, posto solo altrove ...
Per favore fatemi sapere cosa ne pensate