5

我有很多城堡 xml 配置,其中连接字符串等属性也保存在 .Net 配置部分下。

我希望能够使用容器读取属性,但看不到执行此操作的机制。

IE

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

...

显然,这些属性是存在的,因为它们存在组件依赖关系。我可以解析组件,但不能解析属性。

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

*编辑 Markdown 不是很好,上面是一个 xml 部分。

4

2 回答 2

2

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

另一种选择是采用现有的配置解释器并公开在解析配置时收集的属性 - 需要做一些工作(但不会太多)来获得这些......我认为你可以通过以下方式做到这一点:

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

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

于 2008-10-24T02:13:41.670 回答
1

你不是想错了吗?

当然,使用连接字符串的对象在构造函数中应该有一个 ConnectionString 属性,并且在配置的组件部分中将依赖项推入其中,例如:

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

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

于 2008-10-15T14:06:51.610 回答