.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();
}
好了,可以继续开心地玩耍了。