首页 > 解决方案 > ASP.Net Core 3.1 的 Autofac 配置不起作用

问题描述

我正在尝试将 Autofac 与 ASP.Net Core 3.1 一起使用,但我遇到了一个没有意义的异常。

我收到以下异常:

Autofac.Core.Activators.Reflection.NoConstructorsFoundException:'没有为类型'Microsoft.AspNetCore.Mvc.ModelBinding.CompositeBindingSource'找到可访问的构造函数。'

我认为问题可能是因为注册服务的顺序,但我不知道我做错了什么。我的配置如下:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Startup.cs 类

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public ILifetimeScope AutofacContainer { get; private set; }


        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddDbContext<EShopDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DBConnection")));

            services.AddSwaggerGen();

            services.AddOptions();
        }

        public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
            containerBuilder.RegisterModule(new AutofacModule());
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

            app.UseSwagger();

            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "eShop");
                c.RoutePrefix = string.Empty;
            });

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

AutofacModule.cs 类

public class AutofacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            // scan all assemblies in current application domain and resolve them on convention
            builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
                .AsImplementedInterfaces();
        }
    }

我错过了什么?

标签: c#dependency-injectionautofacasp.net-core-3.1

解决方案


我能够在示例代码的帮助下找到问题...

对我来说,问题出在AutofacModule.cs类中。我错误地扫描了组件。这是工作代码。

public class AutofacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            // scan all assemblies in current application domain and resolve them on convention
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                .AsImplementedInterfaces();
        }
    }

Autofac 在 Github 中有项目示例,我发现他们的文档与示例代码不同。这是 ASP.Net Core 3.1 示例的链接。对于任何想要查看配置的人。


推荐阅读