.NetCore 3.0 中使用 Aspectcore + Autofac

        .NetCore 3.0 正式版已經發布了,最近嘗試的幾個測試項目都用的 .NetCore 3.0 。但是在使用時發現,以前使用 Aspectcore 和 Autofac 的方法不好用了。

        之前的方法都是 在 ConfigureServices 方法裏,用 Autofac 從程序集里加載注入的接口和實現,然後用AspectCore 註冊動態代理,然後構建 IServiceProvider 然後返回,並把  ConfigureServices 方法的返回類型改爲  IServiceProvider 。

public IServiceProvider ConfigureServices(IServiceCollection services)
{ 
    builder.RegisterAssemblyTypes(System.Reflection.Assembly
        .GetExecutingAssembly())
        .Where(x =>x.Name.EndsWith("thing")).AsImplementedInterfaces();

    builder.RegisterDynamicProxy();
    var container = builder.Build();

    return new AutofacServiceProvider(container);
}

        但在 .NetCore 3.0 裏,這樣做不行了,提示錯誤。

        NotSupportedException: ConfigureServices returning an System.IServiceProvider isn't supported.

        那要怎麼在 .NetCore 3.0 裏結合使用 Aspectcore 和 Autofac 呢?其實更簡單了。

        第一步:安裝NUGET包:AspectCore.Extensions.Autofac 和 Autofac.Extensions.DependencyInjection
        第二步:在 Program.cs 里加上這句: .UseServiceProviderFactory(new AutofacServiceProviderFactory(),如下:

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

        第三步: 在 Startup.cs 裏添加 ConfigureContainer(ContainerBuilder builder),並在註冊完服務、倉儲後 執行 builder.RegisterDynamicProxy() 代碼如下:

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterAssemblyTypes(typeof(Program).Assembly).
        Where(x => x.Name.EndsWith("service", StringComparison.OrdinalIgnoreCase)).AsImplementedInterfaces();
            builder.RegisterDynamicProxy();
}

好了,可以繼續開心地玩耍了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章