Castle Windsor:对于 N 个字符串,注册一个 class 的 N 个实例并将 strings[n] 传递给 ctor

Castle Windsor: for N strings, register N instances of a class and pass strings[n] to ctor

我有一个 Service class 连接到数据库并提取数据。一个新的要求是我连接到具有相同模式的第二个(或 N 个)数据库,并以相同的方式提取数据。 (每个数据库都有不同的记录,正在区域设置)。

我想重用 Service class,只需将连接字符串传递给服务即可。 (连接字符串当前在 App.config)。

所以,我想为每个我想连接的数据库注册一个服务实例 class,将连接字符串传递给构造函数。

这在温莎城堡可能吗?

我现在最好的选择是:

public class ServiceInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        foreach (var connection in Properties.Settings.Default.ServicedDBs)
        {
            container.Register(
                Component.For<IService>()
                .Named(connection)
                .UsingFactoryMethod(() => new Service(
                    container.Resolve<ILog>(),
                    connection)));
        }
    }
}

有可能。实现您的服务以具有请求连接字符串的构造函数:

public interface IService { }
public class Service : IService
{
    public Service(string connectionString)
    {
        ConnectionString = connectionString;
    }
    public string ConnectionString { get; set; }
}

然后在注册组件时使用 .DependsOn 指定依赖项:

public class ServiceInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        foreach (var connection in Properties.Settings.Default.ServicedDBs)
        {
           container.Register(
               Component.For<IService>()
                        .ImplementedBy<Service>()
                        .DependsOn(Dependency.OnValue("connectionString", connection)
                        .Named(connection)));
        }
    }
}

您也可以将其作为 属性 并使用 属性 注入来设置它,但在我看来,这是适合构造函数的依赖项。有关它的更多信息,请阅读:Dependency injection through constructors or property setters?


曾经有一个关于 .DependsOn 主题的 link 到 SO 文档,但这不是文档的最后一个版本的一部分一般可见。作为清理过程的一部分,引用已被删除。