温莎城堡在嵌套 类 中注入依赖项,根接口在运行时解析

Windsor castle injecting dependency in nested classes with root interface resolved at runtime

我有一系列 类 和我使用依赖注入的接口。问题是 "root" 接口在运行时被解析。因此我不知道如何使用温莎城堡为层次结构中的接口 "higher" 注入依赖项。

这是一个例子:

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
    }
}

问题是一旦我知道我将使用哪个 EEnvironment,我想获得一个 PersonConnection 的实例。但是现在我必须构建 TestEnvironmentConnectionSettings 来获取 DatabaseConnection 和 PersonConnection 等。Windor Castle 可以帮助我这样做,这样我就不必创建工厂了吗?还是我的代码设计不正确?

如果您不直接向构造函数提供 EEnvironment 而是提供一个可以提供 EEnvironment 的接口(来自配置、数据库等),并使用适当的非单例生活方式(瞬态、作用域等)然后当您从 Castle Windsor 容器解析 PersonConnection 时,依赖项也将被解析并建立适当的数据库连接。