错误构造函数控制器MvC 4

时间:2013-07-23 11:41:28

标签: asp.net-mvc asp.net-mvc-4 constructor autofac

 public partial class RegistrationController : Controller
{

    private readonly IPartnerRepository _partnerRepository;

    public RegistrationController(IPartnerRepository partnerRepository)
    {

        _partnerRepository =partnerRepository;

    }}

我使用autofac进行依赖注入,我有这个错误:

` No parameterless constructor defined for this object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[MissingMethodException: No parameterless constructor defined for this object.]
   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) +6
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: Une erreur s'est produite lors de la tentative de création d'un contrôleur de type « Registration.Front.Web.Controllers.RegistrationController ». Assurez-vous que le contrôleur a un constructeur public sans paramètre.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +179
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +197
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +49
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
`

当我从构造函数中删除时,我没有这个错误:

  public partial class RegistrationController : Controller
{

    private readonly IPartnerRepository _partnerRepository;

    public RegistrationController()
    {



    }}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

ASP.NET MVC具有负责创建控制器实例的特殊服务 - 此服务应实现IControllerFactory接口。 IControllerFactory的默认实现期望您的控制器具有无参数构造函数并调用它。 如果您想将DI与控制器一起使用,您有两种可能的选择:

  1. 编写自己的IControllerFactory实现,它使用您的DI容器来实例化控制器。您可以这样注册:

    var factory = new CustomControllerFactory(container); ControllerBuilder.Current.SetControllerFactory(工厂);

  2. 实施IDependencyResolver,可以解决任何MVC基础设施,包括控制器。

  3. 第二种选择是可取的。

    你可以通过更多详细信息here来阅读这些内容(它是关于Unity容器的,但我认为它应该为你提供足够的知识来使用Autofac。

答案 1 :(得分:0)

这可能由于多种原因而发生,其中之一是依赖注入未配置为注入具体的IPartnerRepository类。

第二个是如果具体类本身有一个依赖于另一个依赖注入的构造函数,那么第二个构造函数没有配置为依赖注入。

最后,如果无法找到包含正在注入的类的DLL,也会发生这种情况,但通常注入框架会告诉您它无法找到DLL。