天天看点

.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();
}
           

好了,可以继续开心地玩耍了。

继续阅读