Asp.net

簡單註入器 - 解析 MVC 控制器時沒有為此對象定義無參數建構子

  • September 4, 2021

我有一個新的 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

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

出現此錯誤的原因是您缺少以下註冊(如MVC 集成指南中所述):

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

MVC 和 Web API 都有自己的解析依賴的抽象(都稱為“依賴解析器”)。由於您沒有為 MVC 設置解析器,因此 MVC 使用預設解析機制來創建 MVC 控制器,但這需要控制器具有預設建構子。

打電話DependencyResolver.SetResolver就能解決問題。

引用自:https://stackoverflow.com/questions/25973238