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