【问题标题】:How to read out/resolve properties from Castle Windsor config如何从 Castle Windsor 配置中读取/解析属性
【发布时间】:2008-10-15 13:41:05
【问题描述】:

我有很多城堡 xml 配置,其中连接字符串等属性也保存在 .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部分。

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经实施了这个建议(或多或少)。这感觉就像一个非常讨厌的黑客,但它确实有效。干杯。
【解决方案2】:

你是不是想错了?

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

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

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

【讨论】:

  • 没有。正如您发布的那样,我的组件都使用依赖项。但是我想在代码中直接访问配置文件中定义的属性,就像使用香草.NET 配置样式时使用 My.Setting.ConnectionString yada yada 一样
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多