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

C# Castle Windsor:对于N个字符串,注册一个类的N个实例,并将字符串[N]传递给ctor,c#,constructor,castle-windsor,registration,multiple-instances,C#,Constructor,Castle Windsor,Registration,Multiple Instances,我有一个服务类,它连接到数据库并提取数据。一个新的要求是,我连接到第二个(或N个)具有相同模式的数据库,并以相同的方式提取数据。(每个数据库有不同的记录,按区域设置) 我想重用服务类,只需将连接字符串传递给服务。(连接字符串当前位于App.config) 因此,我想为我要连接的每个数据库注册一个服务类实例,并将连接字符串传递给构造函数 这在温莎城堡可能吗 我现在最好的选择是: public class ServiceInstaller : IWindsorInstaller { publ

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

我想重用
服务
类,只需将连接字符串传递给服务。(连接字符串当前位于
App.config

因此,我想为我要连接的每个数据库注册一个服务类实例,并将连接字符串传递给构造函数

这在温莎城堡可能吗

我现在最好的选择是:

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)));
        }
    }
}
公共类服务安装程序:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
foreach(Properties.Settings.Default.ServicedDBs中的var连接)
{
集装箱。登记(
用于()的组件
.Named(连接)
.使用FactoryMethod(()=>新服务(
container.Resolve(),
连接),;
}
}
}

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

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)));
        }
    }
}
公共类服务安装程序:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
foreach(Properties.Settings.Default.ServicedDBs中的var连接)
{
集装箱。登记(
用于()的组件
.由()实施
.DependsOn(Dependency.OnValue(“connectionString”,connection)
.命名(联系));
}
}
}
您也可以将它作为一个属性,并使用属性注入来设置它,但在我看来,这是一个适合构造函数的依赖项。欲了解更多信息,请阅读:



.DependsOn
主题上曾经有一个指向SO文档的链接,但这不是通常可见的文档最后版本的一部分。作为清理过程的一部分,引用已被删除。

BTW-我看到您将记录器注入构造函数中。在我看来,这是一个弱依赖,最适合通过属性而不是构造函数注入。太棒了!非常感谢。