Unity:当前类型' XXXXX'是一个接口,无法构建。你错过了类型映射吗?

时间:2016-08-24 20:50:04

标签: c# inversion-of-control unity-container ioc-container

我有多个类型派生自同一个界面。我正在使用Unity IOC容器来注册类型

public interface IService
{
}

public class ServiceA : IService
{
}

public class ServiceB : IService
{

}

public class ServiceC : IService
{

}

如果我按以下方式注册这些类型

        container.RegisterType<IService, ServiceA>("NameA");
        container.RegisterType<IService, ServiceB>("NameB");
        container.RegisterType<IService, ServiceC>("NameC");

然后我可以解决以下类型而没有任何问题。

    var service = container.Resolve<IService>("NameA");

但是我得到了需要从外部注册容器的类型列表。 (从文本文件中假设)。所以我只需要注册提供列表中的那些类型。

public class Program
{
    public static void Main()
    {
        // i will be getting this  dictionary values from somewhere outside of application
        // but for testing im putting it here
        var list = new Dictionary<string, string>();
        list.Add("NameA", "ServiceA");
        list.Add("NameB", "ServiceB");
        list.Add("NameC", "ServiceC");


        var container = new UnityContainer();
        var thisAssemebly = Assembly.GetExecutingAssembly();

        //register types only that are in the dictionary
        foreach (var item in list)
        {
            var t = thisAssemebly.ExportedTypes.First(x => x.Name == item.Value);
            container.RegisterType(t, item.Key);
        }

        // try to resolve. I get error here
        var service = container.Resolve<IService>("NameA");
    }
}

我正在异常

  

未处理的类型异常   &#39; Microsoft.Practices.Unity.ResolutionFailedException&#39;发生在   Microsoft.Practices.Unity.dll

     

其他信息:依赖项的解析失败,type =   &#34; ConsoleApplication1.IService&#34;,name =&#34; NameA&#34;。

     

在解析时发生异常。

     

异常是:InvalidOperationException - 当前类型,   ConsoleApplication1.IService,是一个接口,不能   建造。你错过了类型映射吗?

           

在例外时,容器是:

     

解析ConsoleApplication1.IService,NameA

出于某些正当理由,我不想按惯例选项使用Unity的注册,或者使用Unity的配置文件选项来注册类型。我想根据我的清单注册它们。

2 个答案:

答案 0 :(得分:0)

您忘了指定映射IYourInterface - &gt; YourClass

这有效:

std::istringstream

答案 1 :(得分:0)

您错误地使用了依赖注入。正确的方法是让控制器获取所需的依赖项,并留给依赖项注入框架注入具体实例。 查找更多信息here

    public class HomeController: Controller
    {
       private readonly ISettingsManager settingsManager;
       public HomeController(ISettingsManager settingsManager)
    {
        this.settingsManager = settingsManager;
    }

    public ActionResult Index()
    {
        // you could use the this.settingsManager here
    }
}