c# - ASP.NET Core 2.0 使用 Autofac 注入(inject) Controller

标签 c# autofac asp.net-core-2.0

我正在尝试用 Autofac 注入(inject)我的 Controller 。不幸的是,我无法配置 Autofac,因此“DefaultControllerActivator”不会构建我的 Controller ?

    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;
        }
    }

如上所示,我遵循了 Autofac 的文档。不幸的是,LoginController 将不会被构建,因为它需要注入(inject)。

编辑:如果有一种不用 Autofac 就可以使用“模块”的方法,我会很乐意提供任何建议 :)

提前致谢!

最佳答案

默认情况下,ASP.NET Core 会从容器中解析 Controller 参数,但实际上不会从容器中解析 Controller 。这通常不是问题,但它确实意味着:

Controller 的生命周期由框架处理,而不是请求生命周期。

Controller 构造函数参数的生命周期由请求生命周期处理。 您在 Controller 注册期间可能进行的特殊连接(例如设置属性注入(inject))将不起作用。

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

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);
  }
}

关于c# - ASP.NET Core 2.0 使用 Autofac 注入(inject) Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777992/

相关文章:

asp.net-mvc - ASP.NET 中的 NHibernate 与 Autofac (MVC) : ITransaction

elasticsearch - 使用EventStore和ElasticSearch实现CQRS

c# - ObjectIDGenerator 实现

c# - 在控制台应用程序中同步运行的任务

c# - 使用 DefaultCascade.All() 将实体添加到列表时,Nhibernate 不会设置 Id

c# - Prism.Autofac.Forms 实现

c# - 通过 Autofac 进行 Mapster 依赖注入(inject)

c# - 'value' 中的路径必须以 '/' 开头。参数名称 : value

asp.net - .Net Core 2.0 - 获取 AAD 访问 token 以与 Microsoft Graph 一起使用

c# - 随机顺序填充的最佳 C# 数据结构?