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 文档,但这不是文档的最后一个版本的一部分一般可见。作为清理过程的一部分,引用已被删除。
我有一个 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 文档,但这不是文档的最后一个版本的一部分一般可见。作为清理过程的一部分,引用已被删除。