【问题标题】:Simple Injector - No parameterless constructor defined for this object when resolving MVC controllerSimple Injector - 解析 MVC 控制器时没有为此对象定义无参数构造函数
【发布时间】:2014-11-16 08:52:02
【问题描述】:

我有一个新的 MVC Web 项目,我在其中使用 MVC 和 Web API。我在我的全局文件中使用以下代码设置了 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);
    }
}

现在我有 2 个控制器,1 个是 Web API 控制器,1 个是普通 MVC 控制器。

我的 Web API 控制器工作正常,看起来像这样

public class MyApiController : ApiController
{
    private IService _service;

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

    public IHttpActionResult Get(int id)
    {
        // I get my entity here and return it
        EntityObject myEntity = _service.Get(id);
        return Ok(myEntity);
    }
}

正如我所说,上面的代码工作正常,我可以执行 URL,它会返回我期望的结果。

现在我有了我的 MVC 控制器,它看起来和上面的很相似,在这里

public class MyController : Controller
{
    private IService _service;

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

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

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

现在我完全不明白为什么我不断收到以下错误。我无法添加公共构造函数,因为这会导致 Simple Injector 出错。

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

   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

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

【问题讨论】:

    标签: asp.net asp.net-mvc dependency-injection controller simple-injector


    【解决方案1】:

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

    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
    

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

    拨打DependencyResolver.SetResolver 即可解决问题。

    【讨论】:

    • 天哪,我在这上面花了大约 5 个小时。谢谢救星。
    • 我们如何在我正在使用的最新版本的简单注射器中解决相同的问题?版本 4.3.0.0。你能帮忙吗?
    • 文档是最新的,适用于 v4.3。如果您一直遇到问题,您可以发布一个新问题。
    【解决方案2】:

    对于 Web API 项目,上述 SetResolver 方法将编译,但在运行应用程序时,您将收到 ArgumentException 错误:“其他信息:SimpleInjector.Integration.WebApi.SimpleInjectorWebApiDependencyResolver 类型似乎没有实现 Microsoft。 Practices.ServiceLocation.IServiceLocator。”

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

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

    【讨论】:

    • 为我解决了这个问题。在我的例子中,我在 ValuesController 中有一个 web api 和我的 api 端点。我正在使用 SimpleInjector。当我尝试访问返回此错误而不是预期的 XML 响应的 Get 端点时,我遇到了运行时错误。添加上面的行为我解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2021-12-21
    • 2010-11-24
    • 2013-04-25
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多