Sto usando Simple Injector, ma forse quello di cui ho bisogno è più di una risposta concettuale.Come, usando l'iniezione di dipendenza, si ottiene la configurazione da più fonti?
Ecco il punto, supponiamo di avere un'interfaccia con le mie impostazioni delle applicazioni:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
Poi, si sarebbe di solito hanno una classe che implementa IApplicationSettings, ottenendo ogni campo da una fonte specifica, per esempio:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
TUTTAVIA! Diciamo che voglio ottenere EnableLogging
da app.config, CopyLocal
dal database e ServerName
da un'altra implementazione che ottiene il nome del computer corrente. Voglio essere in grado di combinare la configurazione della mia app senza dover creare 9 implementazioni, una per ciascuna combinazione.
Suppongo che non possa passare alcun parametro perché le interfacce sono state risolte dall'iniettore (contenitore).
ho pensato a questo, inizialmente:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{
TEnableLogging EnableLog{get;}
TCopyLocal CopyLocal{get;}
TServerName ServerName{get;}
}
public class ApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Container.GetInstance<TEnableLogging>().Value
}
return enableLogging;
}
}
}
Tuttavia, con questo ho un problema principale: come faccio a sapere come creare un'istanza di TEnableLogging
(che è un IGetValue<bool>
)? Supponiamo che IGetValue<bool>
sia un'interfaccia che abbia una proprietà Value, che sarà implementata dalla classe concreta. Ma la classe concreta potrebbe aver bisogno di alcuni dettagli (come quello che è il nome della chiave in app.config) o meno (potrei semplicemente voler tornare sempre vero).
Sono relativamente nuovo all'iniezione di dipendenza, quindi forse sto pensando in modo sbagliato. Qualcuno ha qualche idea su come realizzare questo?
(Puoi rispondere utilizzando un'altra libreria DI, non mi importa. Credo di aver solo bisogno di afferrare il concetto di esso.)
Grazie, che ha fatto un sacco di senso! Interessante che entrambi abbiamo fatto passi simili e abbiamo realizzato che qualcosa stava andando via nel modo in cui dovrebbe essere haha –