我一直在使用自定义配置对象解决installing a Windsor container问题。这似乎很简单,但显然有一些重要但我没有得到。如果你能帮我填补这个空白,我将不胜感激。
我有一个配置类:
class MyConfiguration
{
int SomeIntValue;
DateTime SomeDateValue;
Action<string> SomeActionValue;
}
我想将这些配置值作为构造函数参数传递给已注册的实现。我想注册应该看起来像:
public class MyInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IFoo>.ImplementedBy<Foo>
.Parameters(Parameter.ForKey("parameter1").Eq( INSERT VALUE HERE (?) );
}
}
那么如何获取这些值并将它们传递给安装程序?我应该使用这个IConfigurationStore
参数吗?如果是这样,我该如何填写它以及我该怎么做呢?
此外,似乎所有配置对象都只能存储字符串值,那么如何传递非字符串的值(例如DateTime
)?
谢谢,祝周末愉快。
答案 0 :(得分:8)
在绝大多数情况下,您不必显式注册构造函数参数。 自动接线功能应该能够自动为您处理。这将使您的代码不那么脆弱,从而更易于维护。
因此,您可以做的最好的事情就是向容器注册MyConfiguration。如果这只有一个类型的注册(正常方案),容器可以明确地解决该类型的任何请求。因此,如果另一个类将MyConfiguration作为构造函数参数,Castle Windsor将自动为您匹配它们。您无需明确指定。
但是,在某些情况下,您需要明确指定特定参数值。对于这些情况,您可以使用ServiceOverrides。这可能看起来像这样:
container.Register(Component.For<MyConfiguration>().Named("myConfig"));
container.Register(Component
.For<IFoo>()
.ImplementedBy<Foo>()
.ServiceOverrides(new { parameter1 = "myConfig" }));
如果您需要指定特定实例,则可以改为使用DependsOn:
var myConfig = new MyConfig();
container.Register(Component
.For<IFoo>()
.ImplementedBy<Foo>()
.DependsOn(new { parameter1 = myConfig }));
答案 1 :(得分:1)
如果你试图传递类型值,比如整数,字符串,枚举等,那么请使用Mark给出的第二个选项。
int val = 23;
container.Register(Component
.For<IFoo>()
.ImplementedBy<Foo>()
.DependsOn(new { parameter1 = val }));