使用Unity Application Block IoC创建字典

问题描述 投票:0回答:2

我想创建一个字典并在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);
            ..
            ...
       }

}

我一直在努力研究,但没有运气。

c# dependency-injection unity-container
2个回答
0
投票

从您发布的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 );
}

0
投票

发布作为答案,因为我没有足够的评论点。这就是我为解决问题所做的工作。不完全是字典方法,但它可能会有所帮助。

我的要求 - 将应用程序设置存储在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存储连接字符串可能不安全,尤其是在连接字符串具有用户名和密码值的情况下。

© www.soinside.com 2019 - 2024. All rights reserved.