Ich benutze Simple Injector, aber vielleicht ist das, was ich brauche, eher eine konzeptionelle Antwort.Wie kann man mithilfe der Abhängigkeitsinjektion die Konfiguration aus mehreren Quellen beziehen?
Hier ist der Deal, nehme ich an eine Schnittstelle mit meinen Anwendungseinstellungen habe:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
Dann würde man in der Regel eine Klasse, die IApplicationSettings implementiert, bekommt jedes Feld aus einer Quelle angegeben, zum Beispiel:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
JEDOCH! Nehmen wir an, ich möchte von app.config, CopyLocal
aus der Datenbank und ServerName
von einer anderen Implementierung erhalten, die den aktuellen Computernamen erhält. Ich möchte meine App-Konfiguration mischen können, ohne 9 Implementierungen zu erstellen, eine für jede Kombination.
Ich gehe davon aus, dass ich keine Parameter übergeben kann, weil die Schnittstellen vom Injektor (Container) gelöst werden.
Ich dachte, dies zunächst:
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;
}
}
}
jedoch mit diesem ich ein Hauptproblem haben: Wie kann ich wissen, wie eine Instanz von TEnableLogging
erstellen (die ein IGetValue<bool>
ist)? Oh, angenommen, dass IGetValue<bool>
eine Schnittstelle ist, die eine Value-Eigenschaft hat, die von der konkreten Klasse implementiert wird. Aber die konkrete Klasse benötigt möglicherweise einige Besonderheiten (wie der Name des Schlüssels in app.config) oder nicht (ich möchte einfach immer True zurückgeben).
Ich bin relativ neu in Abhängigkeit Injektion, also denke ich vielleicht falsch. Hat jemand irgendwelche Ideen, wie dies zu erreichen ist?
(Sie beantworten kann eine andere DI-Bibliothek, werde ich nichts dagegen. Ich glaube, ich muss nur das Konzept der es packen.)
Danke, das sehr viel Sinn gemacht! Interessant, dass wir beide ähnliche Schritte gemacht haben und realisiert haben, dass etwas nicht in Ordnung ist, wie es sein sollte –