C# 混合使用Unity Web API和MVC4 UnityDependencyResolver:未为此对象定义无参数构造函数

C# 混合使用Unity Web API和MVC4 UnityDependencyResolver:未为此对象定义无参数构造函数,c#,asp.net-mvc-4,unity-container,C#,Asp.net Mvc 4,Unity Container,我得到以下例外情况: No parameterless constructor defined for this object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated

我得到以下例外情况:

No parameterless constructor defined for this object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
当框架尝试构造非从ApicController派生的控制器时,例如下面的my simple HomeController:

 public class HomeController : Controller
        {
            private IUnityContainer _unityContainer;
            public HomeController(IUnityContainer unityContainer)
            {
                _unityContainer = unityContainer;
            }
            public ActionResult Index()
            {
                return View();
            }
        }
我定义了以下Boostrapper.cs类:

     public static class Boostrapper
        {
            public static void Initialize()
            {
                var container = BuildUnityContainer();
                GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);                          
            }

            private static IUnityContainer BuildUnityContainer()
            {
                var container = new UnityContainer();
                RegisterTypes(container);
                return container;
            }
        }
而Bootstrapper.Initialize()是在Global.asax.cs的应用程序_Start中执行的最后一行代码吗

从ApicController派生的控制器类上不会引发异常。有人能告诉我我遗漏了什么吗


谢谢。

我想你需要这样的东西

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer();

    // register all your components with the container here
    container.RegisterType<Interface, ClassThatImplementsInterface>();

    return container;
}
私有静态IUnityContainer BuildUnityContainer()
{
var container=new UnityContainer();
//在此处向容器注册所有组件
container.RegisterType();
返回容器;
}
这将告诉您的
运行时
在出现
接口
时要使用哪个
具体类

编辑:基于评论

基本上,您是在告诉运行时哪个
concrete
类型实现了您的
接口
。因此,如果您有一个接口
IRepository
,并且有两个实现,
MockRepo
EFRepo
。您的测试可能会将
MockRepo
传递给任何需要它的构造函数,但是您的
DI
将负责在运行时存储库中注册接口,在这种情况下,
EFRepo


显然,在应用程序的某些测试过程中(即,您浏览网站),您可能会将界面注册设置为使用
MockRepo
,然后一旦准备好部署,您就可以在一个位置切换回
EFRepo

因为我在同一个项目中混合了Web API和MVC4,我还需要确保Unity.WebApi.unitydependencysolverUnity.Mvc4.unitydependencysolver都按照指示进行了设置

我的Boostrapper.cs现在看起来像这样:

    public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();
      GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      return container;
    }

 private static IUnityContainer BuildUnityContainer()
    {
      var container = new UnityContainer();
      RegisterTypes(container);
      return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<IAgencyResolver, AgencyByNameResolver>("ByName");
        container.RegisterType<IAgencyResolver, AgencyByCdeCodeResolver>("ByCode");
        container.RegisterType<IAgencyRepository, AgenciesRepository>();            
    }
publicstaticiunitycontainer初始化()
{
var container=BuildUnityContainer();
GlobalConfiguration.Configuration.DependencyResolver=新的Unity.WebApi.UnityDependencyResolver(容器);
SetResolver(新UnitedDependencyResolver(容器));
返回容器;
}
私有静态IUnityContainer BuildUnityContainer()
{
var container=new UnityContainer();
注册类型(容器);
返回容器;
}
公共静态无效注册表类型(IUnityContainer容器)
{
container.RegisterType(“ByName”);
container.RegisterType(“ByCode”);
container.RegisterType();
}
允许Unity成功解析MVC和Web API控制器。为了同时支持这两个,我需要NuGet包Unity.Mvc4Unity.WebAPI。希望这不会影响我

对我来说

Unity.WebAPI

已经安装了,我正在使用API控制器,并决定为API创建一些视图,我所需要做的就是

安装Unity.Mvc软件包

当我被提升为UnityConfigOverwrite时,我说“不”,作为我的接口,接口到已经按要求运行的具体类。 这在没有任何其他工作或设置的情况下工作


我的项目正在运行.NET 4.5.1 MVC 5.1.2。非常简单,没有以任何方式影响API功能。

您的构造函数看起来很奇怪-为什么要将容器作为依赖项而不是控制器实际依赖的对象传递?(假设您已经阅读了其中描述的配置容器和控制器/解决此特定问题的步骤)感谢提供有用的链接。虽然构造函数看起来很奇怪,但这不是真正的问题。即使我更改签名以接受某些接口,例如iSeries,对于不是从ApicController派生的控制器,我仍然会收到此错误。编辑时为+1。您的回答(+1)非常合理-我认为容器中不存在依赖项,但实际上您需要首先配置两个依赖项解析程序。(有时也不要忘记接受你的答案)。我已经为服务注册做了这些,但这并不能解决控制器构造的问题。@KlausNji,你在哪里注册
IUnityContainer
?这一行位于Boostrapper.Initialize():GlobalConfiguration.Configuration.DependencyResolver=new UnityDependencyResolver(container);有趣的是,从ApiController派生的控制器不会引发异常。我还将container.RegisterType(“Home”)添加到RegisterTypes方法中,但没有成功。我想我需要这行依赖性解析程序。SetResolver(new Unity.Mvc.UnityDependencySolver(container));因为我在同一个项目中混合了WebApi和Mvc。