.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();
}
好了,可以繼續開心地玩耍了。