Asp.net 简单注入器-没有为此对象定义无参数构造函数

Asp.net 简单注入器-没有为此对象定义无参数构造函数,asp.net,asp.net-mvc,dependency-injection,controller,simple-injector,Asp.net,Asp.net Mvc,Dependency Injection,Controller,Simple Injector,我有一个新的MVCWeb项目,我正在使用MVC和WebApi。我在全局文件中使用以下代码设置了Simple Injector(nuGet的2.5.2版) // Register Injectors SimpleInjectorConfig.Register(); 在我的SimpleInjectorConfig.cs文件中 public class SimpleInjectorConfig { public static void Register() { // Crea

我有一个新的MVCWeb项目,我正在使用MVC和WebApi。我在全局文件中使用以下代码设置了Simple Injector(nuGet的2.5.2版)

// Register Injectors
SimpleInjectorConfig.Register();
在我的SimpleInjectorConfig.cs文件中

public class SimpleInjectorConfig
{
    public static void Register() {
        // Create the container as usual.
        Container container = new Container();

        // services
        container.Register<IService, MyService>();

        // data
        container.Register<IRepository, MyRepository>();

        // Register your types, for instance using the RegisterWebApiRequest
        // extension from the integration package:
        container.RegisterMvcControllers(
            System.Reflection.Assembly.GetExecutingAssembly());

        container.RegisterMvcAttributeFilterProvider();

        // This is an extension method from the integration package.
        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

        // verify its all ok
        container.Verify();

        // add dependency
        GlobalConfiguration.Configuration.DependencyResolver = 
            new SimpleInjectorWebApiDependencyResolver(container);
    }
}
现在我一点也不明白为什么我总是犯下面的错误。我无法添加公共构造函数,因为这会导致SimpleInjector出错

System.MissingMethodException:未为此对象定义无参数构造函数


如果有人能为我指出正确的方向,那就太好了。

出现此错误的原因是您缺少以下注册(如中所述):

MVC和WebAPI都有自己的解决依赖关系的抽象(都称为“依赖关系解析器”)。由于没有为MVC设置解析器,MVC使用默认的解析机制来创建MVC控制器,但这要求控制器具有默认构造函数


调用
DependencyResolver.SetResolver将解决此问题。

对于Web API项目,上面描述的SetResolver方法将进行编译,但当应用程序运行时,将出现ArgumentException错误:“其他信息:类型SimpleInjector.Integration.WebApi.SimpleInjector WebApi DependencyResolver似乎未实现Microsoft.Practices.ServiceLocation.IServiceLocator。”

您可以通过将DependencyResolver设置为SimpleInjectorWebApiDependencyResolver并在容器中传递来解决此问题,如下所示

GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

天哪,我已经花了大约5个小时来解决这个问题。谢谢savior。我们如何在我正在使用的最新版本simple injector?4.3.0.0中解决相同的问题。你能帮忙吗?文档是最新的,适用于v4.3。如果你一直有问题,你可以发布一个新问题。为我解决了这个问题。在我的情况下,我有一个web api和我的ValuesController中的api终结点。我使用的是SimpleInjector。当我尝试访问Get终结点时,遇到了运行时错误,该终结点返回了此错误,而不是预期的XML响应。添加上述行为我解决了问题。
public class MyController : Controller
{
    private IService _service;

    public MyController(IService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        return Search();
    }

    // Company/Search
    public ActionResult Search()
    {
        return View();
    }
}
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
   System.Activator.CreateInstance(Type type) +66
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +110

[InvalidOperationException: An error occurred when trying to create a controller of type 'my.project.Web.Controllers.MyController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +438
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +257
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +328
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +157
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);