我有一个依赖于字符串列表的组件:
// 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已经为您提供保障,并且大多数情况下都会为您执行适当的转换。
IList<string>
?答案 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
。
我认为这可以回答你的问题,但要明确:
StringCollection
。Dependency.OnValue
是扩展程序(在我看来),我不知道或看到任何其他地方你会这样做。但是,鉴于上述步骤,我不认为这是必要的。