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文件的
1 2 3 4 5 | container.Register(Component .For<IMyComponent>() .ImplementedBy<MyComponent>() .DependsOn(Dependency.OnAppSettingsValue("someStrings","SomeStrings")) ); |
关于内联依赖项的windsor文档说:
0这里更大的问题是,在
然而,如果它真的只是你需要的字符串,你至少有两个选择,并没有那么糟糕(在我看来)。
1。使用StringCollection将字符串存储在app.config文件中。
这只是在app.config中创建自己的分区的一个较短的内置版本。使用Visual Studio的"项目属性"页中的编辑器添加类型为
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。将字符串作为分隔列表存储在
这可能是一种更简单的方法,不过假设您可以为字符串找到一个分隔符(这种情况并不总是如此)。将值添加到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))); |
在这两种情况下,我们只是在
我认为这可以回答你的问题,但要明确: