0

我一直在使用自定义配置对象来打破我的头installing a Windsor container。这似乎很简单,但显然有一些重要的我只是没有得到。如果你能帮我填补这个空白,我会很感激。在Windsor安装程序中使用强类型配置参数

我有一个配置类:

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

如果你不使用温莎城堡,那么你会在哪里和如何创建一个MyConfiguration的实例? – 2011-03-24 15:47:23

+0

@Mark,MyConfiguration是一个自定义类,它与Castle没有任何关系。我只是将它作为参数从GUI层传递给逻辑层的初始化器。 – 2011-03-25 16:12:16

+1

然后它就像其他任何组件一样。让容器解决它。 – 2011-03-25 16:26:46

回答

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 })); 
+0

绝对的辉煌!几个小时的搜索没有帮我找到这个?你是我的英雄。 – 2011-03-26 14:44:46

1

,如果你想传递一个类型值,像一个整数,字符串,枚举等然后去马克给第二个选项..

int val = 23; 
container.Register(Component 
    .For<IFoo>() 
    .ImplementedBy<Foo>() 
    .DependsOn(new { parameter1 = val })); 
+0

是的,这就是我终于实现了。谢谢。 – 2012-10-13 23:23:50

相关问题