web-dev-qa-db-fra.com

Autofac - Assurez-vous que le contrôleur a un constructeur public sans paramètre.

Je sais que cela a déjà été demandé et qu'on y a déjà répondu. La raison de ma demande est parce que (je pense) que j'ai essayé toutes les solutions suggérées à ce problème mais que je ne parviens toujours pas à le résoudre.

J'ai un projet ASP.NET Web API 2.0. J'ai des dépendances Autofac, Autofac.Mvc5 et Autofac.WebApi2 installées. Lorsque j'essaie d'appeler un contrôleur API, le message d'erreur suivant s'affiche:

Une erreur s'est produite lors de la tentative de création d'un contrôleur de type 'MyController'. Assurez-vous que le contrôleur a un constructeur public sans paramètre.

Dans mon Global.asax, j'ai un appel à IocConfig.Config() que j'ai placé à l'intérieur de App_Start:

public static class IocConfig
{
    public static void Config()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<MyLogger>().As<IMyLogger>();

        builder.RegisterApiControllers(Assembly.GetCallingAssembly());
        builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

        WebApiApplication.Container = builder.Build();

        DependencyResolver.SetResolver(
            new AutofacDependencyResolver(WebApiApplication.Container));
        GlobalConfiguration.Configuration.DependencyResolver =
             new AutofacWebApiDependencyResolver(WebApiApplication.Container);
    }
}

Et voici le constructeur de MyController:

public MyController(IMyLogger logger)

Lorsque j'essaie de l'appeler, j'obtiens l'erreur spécifiée concernant le constructeur. Qu'est-ce que je rate?

14
developer82

J'ai rencontré cette erreur également et la cause principale était que l'une des dépendances du contrôleur n'était pas correctement enregistrée dans Autofac.

L'exception InnerException contient les détails (dans mon cas, il s'agissait d'une exception Autofac.Core.DependencyResolutionException) et ExceptionMessage incluait les détails de cette dépendance. Le long des lignes de:

"Une erreur est survenue lors de l'activation d'un enregistrement particulier ... Impossible de résoudre le paramètre 'XXXX'

14
ScottB

Vérifiez cette réponse .
Cela m'aide à configurer le _ContainerBuilder() correct pour les contrôleurs WebApi. 

Si vous cherchez ici une solution pour une telle erreur, vous devez d'abord vérifier votre configuration DependencyResolver.

J'ai rencontré le même problème et le problème était que j'utilisais des exemples de code Autofac pour l'objet ContainerBuilder() pour les contrôleurs MVC et non pour l'API.

Mon code pour enregistrer les deux types de contrôleurs (MVC et Api):

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
builder.RegisterType<Type>().As<IType>();

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver
6
neustart47

Assembly.GetCallingAssembly() retournera l'assembly appelant, pas l'assembly où vos types sont définis. 

Assembly.GetCallingAssembly Method 
Retourne l'assembly de la méthode qui a appelé la méthode en cours d'exécution.

Pour que cela fonctionne, vous devez utiliser typeof(IocConfig).Assembly ou Assembly.GetExecutingAssembly

3
Cyril Durand

Je pense que vous manquez l'enregistrement d'autofac au code de démarrage de l'application.

Utilisez ceci:

protected void Application_Start()
{
    IocConfig.Config();
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
   BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Pour plus d'informations, consultez ce blog http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

0
error_handler