Castle Windsor:如何将appSettings依赖项转换为列表或数组?

时间:2016-03-02 03:54:29

标签: c# dependency-injection castle-windsor

我有一个依赖于字符串列表的组件:

// ctor
public MyComponent(IList<string> someStrings) { ... }

使用Castle Windsor,我尝试从 app.config 文件的AppSettings部分提供此依赖关系,如下所示:

container.Register(Component
    .For<IMyComponent>()
    .ImplementedBy<MyComponent>()
    .DependsOn(Dependency.OnAppSettingsValue("someStrings", "SomeStrings"))
);

Inline Dependencies上的Windsor文档说:

  

appSettings和conversion :配置文件中的值存储为文本,但代码中的依赖项可能是其他类型(本例中为TimeSpan)。 Windsor已经为您提供保障,并且大多数情况下都会为您执行适当的转换。

  1. 这是否涵盖了我希望转换为IList<string>
  2. 的情况
  3. 如果是这样,在 app.config 文件中输入字符串列表的正确方法是什么?
  4. 如果没有,是否有可扩展点,我可以指定自己的转换?

1 个答案:

答案 0 :(得分:2)

这里更大的问题是在appSettings中存储值列表并不容易。 This question addresses it,最佳答案是在设置文件中创建您自己的部分,然后您必须通过ConfigurationManager.GetSection()而不是ConfigurationManager.AppSettings.Get()which is what Dependency.OnAppSettingsValue() uses访问该部分。通过查看Dependency课程的其余部分,似乎没有内置的方法来执行此操作。

但是,如果它真的只是你需要的字符串,你至少有两个选项并不是那么糟糕(在我看来)。

<强> 1。使用StringCollection将字符串存储在App.config文件中。

这只是在App.config中创建自己的部分的简短内置版本。使用Visual Studio的“项目属性”页面中的编辑器添加类型为StringCollection的应用程序设置。这将使您的App.config看起来像这样:

<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="YourApplication.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <YourApplication.Properties.Settings>
      <setting name="SomeStrings" serializeAs="Xml">
        <value>
          <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <string>one</string>
            <string>two</string>
            <string>three</string>
          </ArrayOfString>
        </value>
      </setting>
    </YourApplication.Properties.Settings>
  </applicationSettings>
</configuration>

然后在配置组件时:

// StringCollection only implements IList, so cast, then convert
var someStrings = Properties.Settings.Default.SomeStrings.Cast<string>().ToArray();
container.Register(Component.For<IMyComponent>()
                            .ImplementedBy<MyComponent>()
                            .LifestyleTransient()
                            .DependsOn(Dependency.OnValue<IList<string>>(someStrings)));

<强> 2。将字符串存储为appSettings中的分隔列表,然后手动拆分。

这可能是更简单的方法,但假设您可以找出字符串的分隔符(可能并非总是如此)。将值添加到App.config文件中:

<configuration>
  <appSettings>
    <add key="SomeStrings" value="one;two;three;four" />
  </appSettings>
</configuration>

然后在配置组件时:

var someStrings = ConfigurationManager.AppSettings["SomeStrings"].Split(';');
container.Register(Component.For<IMyComponent>()
                            .ImplementedBy<MyComponent>()
                            .LifestyleTransient()
                            .DependsOn(Dependency.OnValue<IList<string>>(someStrings)));

在任何一种情况下,我们只是在Dependency.OnValue之上添加少量工作,无论如何都是Dependency.OnAppSettingsValue

我认为这可以回答你的问题,但要明确:

  1. 是的,但您自己正在进行转换,以便转换为您喜欢的任何内容。
  2. 请参阅关联的问题和accepted answer,或使用StringCollection
  3. Dependency.OnValue是扩展程序(在我看来),我不知道或看到任何其他地方你会这样做。但是,鉴于上述步骤,我不认为这是必要的。