Sto costruendo un'applicazione che utilizza AutoFac 2 per DI. Sono stato reading che si dovrebbe evitare di utilizzare un IoCHelper (Localizzatore di servizi) statico.Come evitare Service Locator con AutoFac 2
IoCHelper.cs
public static class IoCHelper
{
private static AutofacDependencyResolver _resolver;
public static void InitializeWith(AutofacDependencyResolver resolver)
{
_resolver = resolver;
}
public static T Resolve<T>()
{
return _resolver.Resolve<T>();
}
}
Da risposte a un previous question, ho trovato un modo per contribuire a ridurre la necessità di usare la mia IoCHelper nel mio UnitOfWork attraverso l'utilizzo di Auto-generated Factories. Continuando su questa strada, sono curioso di poter eliminare completamente il mio IoCHelper.
Ecco lo scenario:
ho una classe statica Impostazioni che funge da wrapper mia implementazione di configurazione. Poiché la classe Settings è una dipendenza dalla maggior parte delle altre classi, il wrapper mi impedisce di dover inserire la classe delle impostazioni su tutta la mia applicazione.
Settings.cs
public static class Settings
{
public static IAppSettings AppSettings
{
get
{
return IoCHelper.Resolve<IAppSettings>();
}
}
}
public interface IAppSettings
{
string Setting1 { get; }
string Setting2 { get; }
}
public class AppSettings : IAppSettings
{
public string Setting1
{
get
{
return GetSettings().AppSettings["setting1"];
}
}
public string Setting2
{
get
{
return GetSettings().AppSettings["setting2"];
}
}
protected static IConfigurationSettings GetSettings()
{
return IoCHelper.Resolve<IConfigurationSettings>();
}
}
C'è un modo per gestire questa situazione senza l'utilizzo di un localizzatore di servizio e senza dover ricorrere ad iniezione AppSettings in ogni classe? Di seguito sono elencati i 3 aree in cui continuano appoggia su ServiceLocator invece di iniezione del costruttore:
- AppSettings
- Logging
- cache
Questo è un buon punto. Sinceramente, probabilmente non ho bisogno di iniettare tali dipendenze in OGNI classe, ma per i casi in cui ho la stessa dipendenza iniettata in un gran numero di classi, ero solo curioso di sapere se esiste qualche buona pratica di DI per questo. –
Vedere la mia risposta aggiornata. A dire il vero, sono stato costretto a farlo in un'occasione: quando non è stato possibile utilizzare l'iniezione del costruttore (il progettista ha richiesto un costruttore senza parametri). –
Soluzione piacevole – Baldy