【问题标题】:Net core 3.0 with Autofac throw IServiceProvider isn't supported不支持带有 Autofac throw IServiceProvider 的 Net core 3.0
【发布时间】:2022-04-05 13:21:32
【问题描述】:

我遇到了一些麻烦,我尝试解决使用 Autofac 和 .net core 3.0-6preview 的问题。 我将new AutofacServiceProviderFactory() 添加到CreateHostBuilder which 是此.net 核心版本框架中的必需项。 代码在 2.1 及更低版本中正常工作,但现在应用程序崩溃了

例外: System.NotSupportedException: '不支持返回 System.IServiceProvider 的配置服务。'

程序类代码:

     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 类:

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

        public IConfiguration Configuration { get; }

        public IContainer ApplicationContainer { get; private set; }


        // This method gets called by the runtime. Use this method to add services to the container.
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var builder = new ContainerBuilder();
            builder.Populate(services);
            builder.RegisterModule(new ContainerModule(Configuration));
            ApplicationContainer = builder.Build();
            return new AutofacServiceProvider(ApplicationContainer);
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApplicationLifetime appLifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

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


            var jwtSettings = app.ApplicationServices.GetService<JwtSettings>();
            var generalSettings = app.ApplicationServices.GetService<GeneralSettings>();
            if (generalSettings.SeedData)
            {
                var dataInitializer = app.ApplicationServices.GetService<IDataInitializer>();
                dataInitializer.SeedAsync();
            }

            //           app.UseMvc();
            appLifetime.ApplicationStopped.Register(() => ApplicationContainer.Dispose());

        }
    }

【问题讨论】:

    标签: c# dependency-injection .net-core autofac


    【解决方案1】:

    配置 Autofac 的启动语法已更改。

    相反,在Startup 中执行以下操作

    public void ConfigureServices(IServiceCollection services) {
        //... normal registration here
    
        // Add services to the collection. Don't build or return
        // any IServiceProvider or the ConfigureContainer method
        // won't get called.
    }
    
    public void ConfigureContainer(ContainerBuilder builder) {
        //configure auto fac here
        builder.RegisterModule(new ContainerModule(Configuration));
    }
    

    参考Autofac documentation ASP.NET Core 3.0+

    【讨论】:

      【解决方案2】:

      您必须更改 program.c

          public static void Main(string[] args)
          {
              CreateWebHostBuilder(args).Build().Run();
          }
      
          public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
             WebHost.CreateDefaultBuilder(args)
                 .ConfigureLogging(options => options.ClearProviders())
                 .UseStartup<Startup>();
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2020-01-31
      • 1970-01-01
      • 2020-01-24
      • 2020-03-28
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多