.net - 如何从 CaSTLe Windsor 配置中读取/解析属性

标签 .net configuration dependency-injection castle-windsor

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

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

IE

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

...

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

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

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

最佳答案

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

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

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

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

    关于.net - 如何从 CaSTLe Windsor 配置中读取/解析属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204737/

    相关文章:

    configuration - 滚动我的 tmux 时自动向下滚动

    eclipse - 在 Eclipse IDE 外部启动运行配置

    java - Guice injector.getInstance() - 好的做法?

    hibernate - 如何将spring的服务bean注入(inject)到JPA实体中?

    c# - 寻找更好的设计 : A readonly in-memory cache mechanism

    .net - VS2010 Workflow Designer 可以自动排列布局吗?

    c# - 表达混合的替代品

    c# - MSMQ 服务未读取队列

    angular - 在两个构建中拆分 Angular CLI 应用程序

    dependency-injection - 使用隐式自绑定(bind)时 Ninject 选择无参数构造函数