ABPvnext源码分析 (二):Autofac整合及动态代理

写在前面:

上一篇我们讲了Abp的核心模块,这一篇我们把DI 的serviceProvider替换成Autofac,另外添加动态代理拦截器功能。动态代理指从DI容器获取组件实例时组件实例不是原实例,而是代理实例。代理实例是对原实例进行了封装, 在实例方法前后添加逻辑处理,让获取的对象表现基于应有对象但又有自己的逻辑。举个例子,代理对象方法可以在原方法前后记录时间戳,来分析原方法的处理时长。Abp Core默认使用的是微软官方的DI实现, 那个功能较简单没有代理功能,为了添加动态代理功能,我们把DI实现替换为Autofac,并使用Autofac集成的代理实现方式Castle Core。
集成Autofac,我们需要添加Volo.Abp.Autofac包,这个包本身是Abp模块,其依赖AbpCastleCoreModule模块(Volo.Abp.CatleCore)

namespace Volo.Abp.Autofac
{
[DependsOn(typeof(AbpCastleCoreModule))]
public class AbpAutofacModule : AbpModule
{

}
}

所以我们添加Volo.Abp.Autofac包并让我们的应用模块DependsOn(typeof(AbpAutofacModule))就自动的把AbpAutofacModule,AbpCastleCoreModule加入到我们的Core中进行模块管理,也就是说那些基于约定的服务会自动注册到我们的abpApplication.Services中,非常的方便。我们在使用Abp中发现好多第三方库都有对应的Volo.Abp.Xxx包也是这个道理,基本上是把包加入我们Abp的模块管理体系,把各自的服务注册放入各自的包当中,这样我们的应用代码就不需要一个一个的注册这些三方库服务,应用模块直接添加DependsOn(typeof(Xxx))即可。

正菜开始:

Abp集成Autofac非常简单 var application = services.AddApplication<TStartupModule>(option=>options.UseAutofac(););
我们看下UseAutofac这个方法

public static void UseAutofac(this AbpApplicationCreationOptions options)
{
var builder = new ContainerBuilder();
options.Services.AddObjectAccessor(builder);
options.Services.AddSingleton((IServiceProviderFactory<ContainerBuilder>) new AbpAutofacServiceProviderFactory(builder));
}

回忆上一篇最后的代码,由于注册了IServiceProviderFactory<ContainerBuilder>,于是使用该实例serviceProviderFactory的工厂方法serviceProviderFactory.CreateServiceProvider(serviceProviderFactory.CreateBuilder(services)完成DI容器IServiceProvider的创建,这就把DI容器具体的创建逻辑交给了AbpAutofacServiceProviderFactory,非常巧妙的设计。

猜你喜欢

转载自www.cnblogs.com/yilianhuaixiao/p/11796663.html