2013-07-23 1 views
1
public partial class RegistrationController : Controller 
{ 

    private readonly IPartnerRepository _partnerRepository; 

    public RegistrationController(IPartnerRepository partnerRepository) 
    { 

     _partnerRepository =partnerRepository; 

    }} 

-je utiliser autoface à l'injection de dépendance et j'ai cette erreur:contrôleur constructeur d'erreur MvC 4

` 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 
` 

lorsque je supprime du constructeur, je n'ai pas cette erreur:

public partial class RegistrationController : Controller 
{ 

    private readonly IPartnerRepository _partnerRepository; 

    public RegistrationController() 
    { 



    }} 

Comment puis-je résoudre ce problème?

+0

Avez-vous binded l'interface référentiel pour une mise en œuvre? –

Répondre

2

ASP.NET MVC dispose d'un service spécial chargé de créer une instance de contrôleur - ce service doit implémenter l'interface IControllerFactory. L'implémentation par défaut du IControllerFactory s'attend à ce que votre contrôleur possède un constructeur sans paramètre et l'invoque. Si vous souhaitez utiliser DI avec les contrôleurs que vous avez deux options possibles:

  1. Écrivez votre propre implémentation de IControllerFactory qui utilise votre conteneur de DI pour instancier un contrôleur. Vous pouvez l'enregistrer de la manière suivante:

    var factory = new CustomControllerFactory (conteneur); ControllerBuilder.Current.SetControllerFactory (usine);

  2. Mettre en œuvre IDependencyResolver qui peut résoudre n'importe quelle partie de l'infrastructure MVC y compris les contrôleurs.

La deuxième option est préférable.

Vous pouvez lire ce genre de choses avec plus de détails here (il est à propos de conteneur unité mais je pense qu'il devrait vous donner suffisamment de connaissances pour le faire avec Autofac ainsi.

0

Cela peut se produire pour un certain nombre de raisons, l'une d'entre elles est que l'injection de dépendance n'est pas configurée pour injecter une classe concrète de IPartnerRepository.

La seconde est que si la classe concrète elle-même a un constructeur qui dépend de l'injection d'une autre dépendance, ce second constructeur n'est pas configuré pour l'injection de dépendance. Enfin, cela peut également arriver si la DLL qui contient la classe en cours d'injection est introuvable, mais en général, l'infrastructure d'injection vous indiquera qu'elle ne peut pas trouver la DLL.

Questions connexes