如何从Castle Windsor配置中读出/解析属性

时间:2008-10-15 13:41:06

标签: .net configuration dependency-injection castle-windsor

我有很多城堡xml配置,其中像connectionstring这样的属性也保存在.Net配置部分下。

我希望能够使用容器读出属性,但看不到这样做的机制。

<castle>
  <configuration>
    <properties>
      <connectionString>Data Source=MyServer;Initial Catalog=YadaYada;User      ID=me;Password=IAmGod</connectionString>
     </properties>
    <components>

...

显然属性存在,因为它们存在组件依赖性。我可以解析组件而不是属性。

当然我可以新建一个组件只是为了读出注入它的属性城堡,或者我可以将所有属性包装在专门用于保存名称/值对的组件中。但我认为有一个简单的container.resolve(“property.connectionstring”)表示法。

*编辑不是很好用markdown,上面的意思是xml部分。

2 个答案:

答案 0 :(得分:2)

您可以通过几种不同的方式实现这一点 - 对于强类型解决方案,显而易见的方法是实现自定义配置类,然后使用windsor配置中的属性连接类的属性(只读属性与一堆构造函数参数可能是最好的,所以其他开发人员不认为他们可以更新它们 - 正如你所指出的那样,保持两者同步还有一些工作要做。也许编写一个小工具来解析配置文件,为这个组件生成windsor配置/类定义,这样你就不需要维护它了。

另一个替代方案是采用现有的配置解释器并公开在解析配置时收集的属性 - 有一些工作(但不是太多)来实现这些...我认为你可以做这个:

  • 创建一个实现IXmlProcessorEngine的装饰器,它捕获对AddProperty(XmlElement元素)的调用,并将元素存储在它自己的私有字典中。
  • 将XmlProcessor替换为您自己的实现(即复制该类的源代码,然后更改构造函数,以便将装饰器包装在执行实际工作的DefaultXmlProcessorEngine实例周围,以便记录各种add-property调用)
  • 从XmlInterpreter继承并覆盖ProcessResource方法,以便它调用XmlProcessor替换。
  • 决定如何获取装饰器存储的属性,也许它配置了一个字典,该字典依次通过构造函数从XmlInterpreter和XmlProcessor传入..

不幸的是,AFAIK这些属性没有传递给配置存储,因为它们只在解释阶段使用 - 而且我不相信在解析的这个阶段会调用类型转换器,因此值将会是字符串,但至少if / else等条件语句将被正确评估,以及包括。

答案 1 :(得分:1)

你不是以错误的方式思考这个问题吗?

当然,使用连接字符串的对象应该在构造函数中具有ConnectionString属性,并在其中推送依赖项,其中包含config的components部分中的内容:

<component type="SessionManager">
  <parameters>
    <connectionString>#{connectionString}</connectionString>
  </parameters>
</component>

这样连接字符串将自动传入,您的组件根本不需要知道容器 - 解耦和内聚!!!