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

Castle Windsor: How to convert an appSettings dependency to a list or an array?

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

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

使用castle windsor,我试图从app.config文件的AppSettings部分提供这种依赖关系,如下所示:

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

关于内联依赖项的windsor文档说:

0

  • 这包括我想转换成IList的情况吗?
  • 如果是,在app.config文件中输入字符串列表的正确方法是什么?
  • 如果没有,是否有一个扩展点可以指定我自己的转换?

  • 这里更大的问题是,在appSettings中存储一个值列表并不容易。这个问题解决了这个问题,最好的答案是在设置文件中创建您自己的部分,然后您必须通过ConfigurationManager.GetSection()而不是ConfigurationManager.AppSettings.Get(),这是dependency.onAppSettingsValue()使用的。从Dependency类的其余部分来看,似乎没有内置的方法来实现这一点。

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

    1。使用StringCollection将字符串存储在app.config文件中。

    这只是在app.config中创建自己的分区的一个较短的内置版本。使用Visual Studio的"项目属性"页中的编辑器添加类型为StringCollection的应用程序设置。这将使app.config看起来像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <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>
     
        <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>

    然后在配置组件时:

    1
    2
    3
    4
    5
    6
    // 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文件中:

    2

    然后在配置组件时:

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

    在这两种情况下,我们只是在Dependency.OnValue的基础上增加了少量的工作,而Dependency.OnAppSettingsValue无论如何都是这样做的。

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

  • 是的,但是你要自己做转换,这样你就可以转换成你想要的任何东西。
  • 请参阅链接的问题和接受的答案,或使用StringCollection
  • 在我看来,Dependency.OnValue是一个扩展,我不知道也不知道你会在其他地方做这件事。然而,考虑到上述步骤,我认为这是不必要的。