web-dev-qa-db-fra.com

Contrôleur d'injection ASP.NET Core 2.0 avec Autofac

J'essaie d'injecter mon contrôleur avec Autofac. Malheureusement, je ne suis pas en mesure de configurer Autofac à distance afin que le "DefaultControllerActivator" ne construise pas mes contrôleurs?

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddControllersAsServices();
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterModule<ServiceModule>();
        containerBuilder.Populate(services);
        containerBuilder.RegisterType<LoginController>().PropertiesAutowired();

        ApplicationContainer = containerBuilder.Build();
        return new AutofacServiceProvider(this.ApplicationContainer);
    }

    public class ServiceModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterModule(new DataProviderModule());
            builder.RegisterType(typeof(LoginService)).As(typeof(ILoginService)).InstancePerRequest();
        }
    }

    [Route("api/[controller]")]
    public class LoginController : Controller
    {
        private readonly ILoginService _loginService;

        public LoginController(ILoginService loginService)
        {
            _loginService = loginService;
        }
    }

J'ai suivi la documentation d'Autofac comme indiqué ci-dessus. Malheureusement, le LoginController ne sera pas construit car il nécessite une injection.

edit: S'il existe un moyen d'utiliser des "modules" sans Autofac, je serais très intéressant pour toutes suggestions :)

Merci d'avance!

4
Nieksa

Utilisez InstancePerLifetimeScope dans ASP.NET Core. les différences entre ASP.NET et ASP.NET Core comme celle-ci sont documentées .

4
Travis Illig

Par défaut, ASP.NET Core résoudra les paramètres du contrôleur à partir du conteneur, mais ne résout pas réellement le contrôleur à partir du conteneur. Ce n'est généralement pas un problème, mais cela signifie:

Le le cycle de vie du contrôleur est géré par le framework, pas la durée de vie de la requête.

Le cycle de vie des paramètres du constructeur du contrôleur est géré par la durée de vie de la demande. Le câblage spécial que vous avez pu effectuer lors de l'enregistrement du contrôleur (comme la configuration de l'injection de propriété) ne fonctionnera pas.

Vous pouvez changer cela en spécifiant AddControllersAsServices () lorsque vous enregistrez MVC avec la collection de services. Cela enregistrera automatiquement les types de contrôleurs dans IServiceCollection lorsque vous appelez builder.Populate (services).

public class Startup
{
  public IContainer ApplicationContainer {get; private set;}
  public IServiceProvider ConfigureServices(IServiceCollection services)
  {
    // Add controllers as services so they'll be resolved.
    services.AddMvc().AddControllersAsServices();

    var builder = new ContainerBuilder();

    // When you do service population, it will include your controller
    // types automatically.
    builder.Populate(services);

    // If you want to set up a controller for, say, property injection
    // you can override the controller registration after populating services.
    builder.RegisterType<MyController>().PropertiesAutowired();

    this.ApplicationContainer = builder.Build();
    return new AutofacServiceProvider(this.ApplicationContainer);
  }
}
4
Pepito Fernandez