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

时间:2019-08-07 16:38:21

标签: unity-container

我在Web API项目中具有以下类/接口

namespace API.Services
{
    public class APIService : IAPIService
    {
        public APIService() { }
    }
}

namespace API.Services
{
    public interface IAPIService
    {
    }
}

我正尝试通过Unity配置文件进行解析,如下所示:

<Unity>

    <typeAliases>

      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity"/>

      <typeAlias alias="IAPIService" type="API.Services.IAPIService, API.Services"/>  

    </typeAliases>

    <containers>
      <container>
        <types>

          <type
            type="IAPIService"
            mapTo="API.Services.APIService, API.Services"
                >
          </type>

        </types>


      </container>
    </containers>
  </Unity>

然后我在应用程序中开始从配置文件读取并尝试配置该部分

UnityConfigurationSection section = 
(UnityConfigurationSection)config.GetSection("Unity");

section.Configure(container); << error here

这时出现错误System.InvalidOperationException:'无法解析类型名称或别名IAPIService。请检查您的配置文件并验证此类型名称。'

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

因此,您混合使用“使用别名”和“不使用别名”。就个人而言,我永远不会这样做。

选项1 :(无别名)

您还需要在界面中加入程序集名称。

下面的通用示例。如果接口和具体对象都在同一程序集“ MyCompany.Apps”(也称为“ MyCompany.Apps.dll”)中,则为

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>


<register type="MyCompany.Apps.MyInterfaceObject, MyCompany.Apps" mapTo="MyCompany.Apps.MyConcreteObject, MyCompany.Apps" />



</container>
</unity>

选项2 :(始终使用别名)

下面显示了同一程序集“ MyCompany.MyTechnology.MyApplications”(又名“ MyCompany.MyTechnology.MyApplications.dll”)中的界面和具体对象

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

  <typeAliases>

    <typeAlias alias="IMyInterfaceObjectAlias"  type="MyCompany.MyTechnology.MyApplications.Interfaces.IMyInterfaceObject, MyCompany.MyTechnology.MyApplications" />
    <typeAlias alias="MyConcreteObjectAlias"  type="MyCompany.MyTechnology.MyApplications.MyConcreteObject, MyCompany.MyTechnology.MyApplications" />

  </typeAliases>

  <containers>

    <container>

      <register type="IMyInterfaceObjectAlias" mapTo="MyConcreteObjectAlias"/>

    </container>

  </containers>
</unity>

PS

使用“ singleton”(关键字)作为别名的名称。...恕我直言,这不是一个好主意。尽管从技术上讲可能可行,但浪费时间的调试关键字(而且名称也含糊不清)并不值得。

请注意我如何在别名“ Alias”的末尾加上“别名”,以免产生歧义。

只需提供一个友好的提示。