2017-07-20 1 views
1

Ich habe eine Reihe von Klassen und Schnittstellen, für die ich Abhängigkeitsinjektion verwenden. Das Problem ist, dass die "root" -Schnittstelle zur Laufzeit aufgelöst wird. Daher weiß ich nicht, wie man Windsor Castle benutzt, um Abhängigkeiten für Schnittstellen "höher" in der Hierarchie zu injizieren.Windsor Castle injizierende Abhängigkeit in verschachtelten Klassen mit Root-Schnittstelle zur Laufzeit aufgelöst

Hier ist ein Beispiel:

public interface IConnectionSettings 
{ 
    string ConnectionString { get; } 
} 

public class TestEnvironmentConnectionSettings 
{ 
    string ConnectionString { get; } 

    public TestEnvironmentConnectionSettings(EEnvironment environment) 
    { 
     ConnectionString = "ConnectionStringTo" + environment; 
    } 
} 

public interface IDatabaseConnection 
{ 
    IEnumerable<T> RunQuery<T>(string query); 
} 

public class DatabaseConnection : IDatabaseConnection 
{ 
    private readonly IConnectionSettings _connectionSettings; 

    public DatabaseConnection(IConnectionSettings connectionSettings) 
    { 
     _connectionSettings = connectionSettings; 
    } 

    public IEnumerable<T> RunQuery<T>(string query) 
    { 
     // do something and return results 
    } 
} 

public interface IPersonConnection 
{ 
    Person GetPerson(int id); 
} 

public class PersonConnection : IPersonConnection 
{ 
    private readonly IDatabaseConnection _databaseConnection; 

    public PersonConnection(IDatabaseConnection databaseConnection) 
    { 
     _databaseConnection = databaseConnection; 
    } 

    public GetPerson(int id) 
    { 
     // prepare query and return results 
    } 
} 

Das Problem ist, würde Ich mag eine Instanz von PersonConnection erhalten, sobald ich weiß, was ich eEnvironment verwenden. Aber jetzt muss ich TestEnvironmentConnectionSettings erstellen, um DatabaseConnection zu erhalten und PersonConnection usw. zu bekommen. Kann Windor Castle mir helfen, dies zu tun, damit ich keine Fabrik erstellen muss? Oder ist mein Code falsch entworfen?

Antwort

1

Wenn Sie nicht über die EEnvironment an den Konstruktor direkt zur Verfügung stellen und stattdessen eine Schnittstelle bereitstellen, als den EEnvironment zur Verfügung stellen kann (von config-Datenbank, was auch immer), und registrieren Sie alle Komponenten des entsprechenden nicht-Singleton Lebensstil mit (transient, scoped usw.) Wenn Sie einen PersonConnection aus dem Castle Windsor Container auflösen, werden die Abhängigkeiten ebenfalls aufgelöst und die entsprechende Datenbankverbindung hergestellt.

+0

Ich könnte das tun, aber die Anforderungen sind, dass EEnvironment zur Laufzeit ändert. Insbesondere kann der Benutzer die Umgebung über die GUI mithilfe von Kontrollkästchen ändern. Denkst du, es wäre in Ordnung, eine separate Klasse zu haben, die das Kontrollkästchen anschaut und die aktuelle Umgebung zurückgibt? Vielen Dank. – shymo

+0

Der Punkt ist, dass Sie eine Schnittstelle definieren, die ein'EEnvironent', 'IEnvironmentProvider' zum Beispiel zur Verfügung stellt, es spielt keine Rolle, ob die Implementierung dieser Schnittstelle mit einem Kontrollkästchen oder einer Datenbank oder einer Konfiguration verbunden ist. –

Verwandte Themen