我想创建一个字典并在Unity的配置文件中填充它,如here所示。但是,该示例似乎来自较旧版本的Unity IoC,但我想知道如何使用Unity 4执行此操作。
<type ... to="MyTypeServer">
<typeConfig>
<property Name="Converters" KeyType"string" ValueType="IConverter">
<entry>
<key>csv</key>
<value><dependency name="csvConverter"/></value>
</entry>
<entry>
<key>xml</key>
<value><dependency name="xmlConverter"/></value>
</entry>
</property>
</typeConfig>
</type>
<type name="csvConverter" from="IConverter" to="MyCsvConverter">
</type>
<type name="xmlConverter" from="IConverter" to="MyXmlConverter">
</type>
这是班级:
public class MyTypeServer
{
public IDictionary<string, IConverter> Converters
{
set;
private get;
}
public void DoConversion(string fileName)
{
string fileType = Path.GetFileExtension(fileName);
IConverter converter = Converters[fileType];
if (converter != null)
converter.DoConversion(fileName);
..
...
}
}
我一直在努力研究,但没有运气。
从您发布的codeplex链接:
这是我们可以使用字典的东西类型的快速伪代码。
对我来说,这写着“如果我们实现这个功能,我们可以做这样的事情”。与我团结的经验一致,我从未遇到过这样的事情。
但你可以做的是:注册所有转换器,将它们全部注入数组,然后自己构建字典。
// register in code or in xml...
container.RegisterType<IConverter, XmlConverter>( "xml-Converter" );
container.RegisterType<IConverter, JsonConverter>( "json-Converter" );
internal class ConverterConsumer
{
public ConverterConsumer( IConverter[] converters )
{
_converters = converters.ToDictionary( x => x.FileType, x => x );
}
#region private
private Dictionary<string, IConverter> _converters;
#endregion
}
public interface IConverter
{
string FileType { get; }
void DoConversion( string fileName );
}
发布作为答案,因为我没有足够的评论点。这就是我为解决问题所做的工作。不完全是字典方法,但它可能会有所帮助。
我的要求 - 将应用程序设置存储在Unity XML文件中而不是app.config中
我有各种在Unity XML中注册的对象,它们具有连接字符串,Azure队列名称,Azure blob容器名称等属性。我发现自己经常在XML中复制这些值。我可以让我的对象从app.config的* appSettings **元素或其他配置部分读取值。但是,我选择不使用app.config以保持我的对象更易测试。
我的解决方案 - 使用<instance>元素注册可重用的字符串值
我在一个位置注册了所有可重用的连接字符串,如下所示,没有任何重复:
<instance name="cnstring1" value="blah connection string 1"></instance>
<instance name="cnstring2" value="blah connection string 2"></instance>
<instance name="azurequeue1" value="name of receiver queue "></instance>
<instance name="azurequeue2" value="name of sender queue "></instance>
<instance name="azurestoragecnstring" value="your azure storage account connection string 0001"></instance>
使用所需的依赖元素引用名称 - 值对。
示例XML:
<register name="i2" mapTo="someimplementation" type="someinterface">
<property name="Database">
<dependency name="cnstring1" />
</property>
</register>
示例C#代码段:
public string Database { get; set; }
在运行时,具有注册i2的对象的属性Database将被设置为blah连接字符串1的值
注意事项
以纯文本XML存储连接字符串可能不安全,尤其是在连接字符串具有用户名和密码值的情况下。