Simple Injector - 没有为此对象定义的无参数构造函数

时间:2014-09-22 11:39:23

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

我有一个新的MVC Web项目,我在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);
    }
}

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

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

public class MyApiController : ApiController
    {
        private IService _service;

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

        /// <summary>
        /// GET api/<controller>/5
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        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();
    }

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

现在我无法理解为什么我一直收到以下错误。我无法添加公共构造函数,因为这会导致SimpleInjector出错。

  

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

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

2 个答案:

答案 0 :(得分:21)

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

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

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

调用DependencyResolver.SetResolver将解决问题。

答案 1 :(得分:2)

对于Web API项目,上面描述的SetResolver方法将编译,但是当运行应用程序时,您将收到ArgumentException错误:&#34;其他信息:类型SimpleInjector.Integration.WebApi.SimpleInjectorWebApiDependencyResolver不似乎实现了Microsoft.Practices.ServiceLocation.IServiceLocator。&#34;

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

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