autofac通用主机无法解析类型.netcore webapi 3..1

问题描述

我正在尝试向RegisterassemblyTypes注册程序集,但无法解析服务。得到以下异常。 InvalidOperationException:尝试激活“ Ui.Controllers.WeatherForecastController”时,无法解析类型为“ applicationservices.Services.ITestService”的服务。

服务位于不同的类库中。将这些服务注入到天气控制器构造函数中。

Program.cs

public class Program
{       
    public static void Main(string[] args)
    {
        //CreateHostBuilder(args).Build().Run(); 
        var host = Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureContainer<ContainerBuilder>(b =>
            {
                b.RegisterModule(new RegisterServices());

            })
             .ConfigureWebHostDefaults(webBuilder =>
             {
                 webBuilder.UseStartup<Startup>();
             }).Build();
        host.Run();
    }
}

Startup.cs

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

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

   
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddOptions();  
    }

    public void ConfigureContainer(ContainerBuilder builder)
    {
        builder.RegisterModule(new RegisterServices());
    }

    
    public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
    {
        this.AutofacContainer = app.applicationservices.GetAutofacRoot();
        
        var aa = this.AutofacContainer.ComponentRegistry.Registrations.Where(x => 
        x.Activator.LimitType.Name.StartsWith("Tes"));

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseAuthorization();

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

RegisterService.cs

public class RegisterServices : Autofac.Module
{
    private const string RepositoryNamespace = "applicationservices";
    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);
       
        string binPath = 
             System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory);
        List<Assembly> allAssemblies = new List<Assembly>();
        foreach (string dll in Directory.GetFiles(binPath,"*.dll",SearchOption.AllDirectories))
        {
            try
            {
                allAssemblies.Add(Assembly.LoadFile(dll));
            }
            catch (FileLoadException loadEx)
            { } // The Assembly has already been loaded.
            catch (BadImageFormatException imgEx)
            { }

        } // foreach dll

        var cAssembly = allAssemblies
                .Where(a => a.FullName.StartsWith(RepositoryNamespace,StringComparison.InvariantCultureIgnoreCase))
                .FirstOrDefault();

        builder.RegisterassemblyTypes(cAssembly)
            .Where(t => t.Name.EndsWith("Service"))
            .As(t => t.GetInterfaces()[0])
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)