如何使用Dependency.OnValue来区分具有相同名称但不同类型的2个参数

时间:2014-05-07 05:30:03

标签: c# castle-windsor

我在尝试使用自动生成的Web服务客户端时遇到了一个有趣的场景。这意味着我无法修改其他类构造函数。 它有2个构造函数,如下所示: -

public FooServicePortTypeClient(string endPointConfigurationName, string remoteAddress)
public FooServicePortTypeClient(string endPointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)

注意参数名称“remoteAddress”是如何使用两次的,但是对于一个构造函数,它是一个字符串,另一个是EndpointAddress对象。

我试图通过具有内联依赖关系的windsor容器注册我的Web服务,方法是使用DependsOn传递服务客户端的参数: -

container.Register(Component.For<FooServicePortTypeClient>().DependsOn(Dependency.OnValue("endPointConfigurationName", "fooEndpointConfigname"), Dependency.Onvalue("remoteAddress", "fooRemoteAddress"))));

然后我注意到,windsor试图将remoteAddress的字符串与带有类型参数EndpointAddress的构造函数匹配(并因此失败),而不是选择字符串版本。

有没有办法实际能够区分2个“不同”的参数,以便我可以选择使用带字符串的那个或带有EndpointAddress的那个?

我发现我只能使用Dependency.OnValue指定参数名称,并且尝试键入的版本没有意义,因为构造函数中有2个字符串(endPointConfigurationName和remoteAddress),它们无法区分它们。

就个人而言,这是微不足道的,我绝对可以通过向它提供一个新的EndpointAddress对象来做Castle Windsor正在寻找的东西。 但是,我只是想知道Castle windsor如何决定使用Dependency.OnValue的构造函数版本,以及是否真的有办法让它更喜欢其中一个。当然,我认为对于像我这样没有经验的用户而言,这是一个陷阱,期望字符串版本能够正常工作。

1 个答案:

答案 0 :(得分:0)

Dependency.OnValue有一个重载,允许您提供类型:

Dependency.OnValue<System.ServiceModel.EndpointAddress>(endpointAddress)

这告诉Windsor解决“更高级别”类型(与stringint等基本类型相比)。有关详细信息,请参阅docs