Asp.net
簡單註入器 - 解析 MVC 控制器時沒有為此對象定義無參數建構子
我有一個新的 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就能解決問題。