C# ASP.NET Core 2.0带Autofac的注入控制器

C# ASP.NET Core 2.0带Autofac的注入控制器,c#,autofac,asp.net-core-2.0,C#,Autofac,Asp.net Core 2.0,我正试图给我的控制器注入Autofac。不幸的是,我无法将Autofac配置为“DefaultControllerActivator”,这样“DefaultControllerActivator”就不会构造我的控制器了 public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc().AddControllersAsServices();

我正试图给我的控制器注入Autofac。不幸的是,我无法将Autofac配置为“DefaultControllerActivator”,这样“DefaultControllerActivator”就不会构造我的控制器了

    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;
        }
    }
公共IServiceProvider配置服务(IServiceCollection服务)
{
services.AddMvc().addControllerAsservices();
var containerBuilder=新的containerBuilder();
containerBuilder.RegisterModule();
containerBuilder.Populate(服务);
containerBuilder.RegisterType().PropertiesAutowired();
ApplicationContainer=containerBuilder.Build();
返回新的AutofacServiceProvider(this.ApplicationContainer);
}
公共类服务模块:模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
RegisterModule(新的DataProviderModule());
builder.RegisterType(typeof(LoginService)).As(typeof(ILoginService)).InstancePerRequest();
}
}
[路由(“api/[控制器]”)]
公共类登录控制器:控制器
{
专用只读ILoginService(U loginService);
公共登录控制器(ILoginService loginService)
{
_loginService=loginService;
}
}
我遵循了Autofac的文档,如上所示。不幸的是,LoginController将不会被构造,因为它需要注入

编辑:如果有一种不用Autofac就可以使用“模块”的方法,我会非常有兴趣听取任何建议:)


提前谢谢你

在ASP.NET核心中使用
InstancePerLifetimeScope
。默认情况下,ASP.NET Core将从容器解析控制器参数,但实际上不会从容器解析控制器。这通常不是问题,但它确实意味着:

控制器的生命周期由框架处理,而不是请求生命周期

控制器构造函数参数的生命周期由请求生命周期处理。 在控制器注册期间可能进行的特殊接线(如设置属性注入)将无法工作

在向服务集合注册MVC时,可以通过指定AddControllerAsseServices()来更改此设置。这样做将在调用builder.Populate(services)时自动将控制器类型注册到IServiceCollection中

公共类启动
{
公共IContainer应用程序容器{get;private set;}
公共IServiceProvider配置服务(IServiceCollection服务)
{
//将控制器添加为服务,以便解决这些问题。
services.AddMvc().addControllerAsservices();
var builder=new ContainerBuilder();
//当您进行服务填充时,它将包括您的控制器
//自动输入。
建造商。填充(服务);
//如果你想为属性注入设置一个控制器
//您可以在填充服务后覆盖控制器注册。
builder.RegisterType().PropertiesAutowired();
this.ApplicationContainer=builder.Build();
返回新的AutofacServiceProvider(this.ApplicationContainer);
}
}

<代码> >如果您正在阅读此答案,请考虑将此属性添加到启动类中:[…公开IContainer ApplicationContainer { get;私集;}…} SEP,谢谢!已修复。@PepitoFernandez您是从哪个类获得方法
Populate()
?我已经安装了Autofac版本4.6.1,但我不能将“Populate()”作为类
ContainerBuilder
@Manfred上的方法,我现在不太记得了。它可能是一个扩展方法(很可能需要您添加该名称空间)。@PepitoFernandez感谢您的回复。我发现了:我必须安装另一个名为
Autofac.Extensions.DependencyInjection
的NuGet软件包,并将名称空间
Autofac.Extensions.DependencyInjection
添加到文件
Startup.cs
中,然后编译器很高兴。
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);
  }
}