Unity 3 - 无法解析类型名称或别名xxxx

时间:2015-05-26 14:31:31

标签: c# .net xml configuration unity-container

我已经在这里阅读了几个相关的问题,但我仍然无法使我的Unity XML配置正常工作。

这是我的配置文件......

<?xml version="1.0" encoding="utf-8"?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="System.Security" />
    <namespace name="System.Security.Cryptography" />
    <container name="Default">
        <register type="HashAlgorithm" mapTo="SHA256Managed" />
        <register type="SymmetricAlgorithm" mapTo="AesCryptoServiceProvider" />
    </container>
</unity>

我得到的错误信息是......

  

无法解析类型名称或别名 AesCryptoServiceProvider 。   请检查您的配置文件并验证此类型名称。

HashAlgorithm正常解析,而不是AES提供商。

我的项目中引用了 System.Security 程序集,如果我这样做,则可以解析 SymmetricAlgorithm 类型...

IUnityContainer Container = new UnityContainer ();

Container.RegisterType<SymmetricAlgorithm, AesCryptoServiceProvider> ();

...但如果可能的话,我希望将配置保留在代码之外。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

问题是AesCryptoServiceProvider不在System.Security中。您将在System.Core程序集中找到它。

因此,您需要修复统一配置以包括该程序集,如下所示:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <namespace name="System.Security.Cryptography" />
  <assembly name="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <container name="Default">
    <register type="HashAlgorithm" mapTo="SHA256Managed" />
    <register type="SymmetricAlgorithm" mapTo="AesCryptoServiceProvider" />
  </container>
</unity>

注意:您需要提供程序集的全名(包含版本,文化和令牌)。这是因为Unity只是将名称空间和程序集名称与类型名称连接起来,然后它将检查结果类型是否存在(检查documentation here)。使用其名称加载类型时,大多数情况下您需要完全限定名称,例如,请参阅Type.GetType中有关类型名称的注释:

  

要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了