使用Unity Application Block IoC创建字典

时间:2017-03-31 15:51:55

标签: c# dependency-injection unity-container

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

}

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

2 个答案:

答案 0 :(得分:0)

您发布的codeplex链接:

  

这是我们可以使用字典的东西类型的快速伪代码。

对我来说,如果我们实现了这个功能&#34;我们可以做这样的事情。与我在团结方面的经验一致,我从来没有遇到过这样的事情。

可以做什么:注册所有转换器,将它们全部注入数组,然后自己构建字典。

// 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 );
}

答案 1 :(得分:0)

发帖作为答案,因为我没有足够的意见要发表。这就是我解决问题的方法。不完全是字典方法,但可能会有所帮助。

我的要求-将应用程序设置存储在Unity XML文件中,而不是app.config

我有多个在Unity XML中注册的对象,它们具有连接字符串,Azure队列名称,Azure Blob容器名称等属性。我发现自己经常在XML中复制这些值。我可以使我的对象从 app.config 的* appSettings **元素或其他一些配置部分读取值。但是,我选择不使用app.config来保持对象的可测试性。

我的解决方案-使用元素注册可重复使用的字符串值

我将所有可重复使用的连接字符串注册在一个位置,如下所示,并且没有重复:

<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>

在需要时使用 dependency 元素引用名称/值对。

示例XML:

  <register name="i2" mapTo="someimplementation" type="someinterface">
      <property name="Database">
        <dependency name="cnstring1" />
      </property>
  </register>

示例C#代码段:

public string Database { get; set; }

在运行时,注册为 i2 的对象的属性 Database 将设置为空白连接字符串1 的值。 >

注意事项

以纯文本XML存储连接字符串可能不安全,尤其是在连接字符串具有用户名和密码值的情况下。