繁体   English   中英

没有注册“IServiceProviderFactory[Autofac.ContainerBuilder]”类型的服务

[英]No service for type 'IServiceProviderFactory[Autofac.ContainerBuilder]' has been registered

运行以下命令添加数据库迁移脚本时,出现以下错误:

dotnet ef migrations add InitialCreate -v -o .\Migrations\ --context MyContext

访问 Microsoft.Extensions.Hosting 服务时出错。 在没有应用程序服务提供商的情况下继续。 错误:没有注册“Microsoft.Extensions.DependencyInjection.IServiceProviderFactory`1[Autofac.ContainerBuilder]”类型的服务。

我遵循了这个文档。 Startup类实现如下:

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;
        WebHostingEnvironment = env;
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        this.Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc(options => options.EnableEndpointRouting = false)
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

        services.AddCustomDbContext(Configuration);
        services.AddOptions();
    }

    public void ConfigureContainer(ContainerBuilder builder)
    { }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseHttpsRedirection();
        app.UseMvc();
        ConfigureEventBus(app);
    }
}

关于导致错误的原因以及如何修复它的任何想法?

版本:

<TargetFramework>netcoreapp3.1</TargetFramework>
<PackageReference Include="Autofac" Version="4.9.4" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="5.0.1" />

您必须在 Program.cs 中配置 Autofac:

var hostBuilder = new WebHostBuilder()
            .UseContentRoot(Path.GetDirectoryName(path))
            .ConfigureServices(services => services.AddAutofac())
            .ConfigureAppConfiguration(cb =>
            {
                cb.AddJsonFile("appsettings.json", optional: false).AddEnvironmentVariables();
            }).UseStartup<Startup>();

或者

 return Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureAppConfiguration((builderContext, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {   
                webBuilder.UseStartup<Startup>();
            });

ConfigureServices替换为以下内容:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc(options => options.EnableEndpointRouting = false)
        .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    services.AddCustomDbContext(Configuration);
    services.AddOptions();

    var container = new ContainerBuilder();
    container.Populate(services);
    return new AutofacServiceProvider(container.Build());
}

请注意,这与Autofac 的文档建议完全矛盾,但它是解决问题所必需的。

将服务添加到集合中。 不要构建或返回任何 IServiceProvider,否则不会调用 ConfigureContainer 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM