使用 DryIoc 替换 Abp 的 DI 框架 (11)

这里一定要注意 AspNetCoreApp.Application 库里面的 AspNetCoreAppAppicationModule 模块一定要在 Initialize() 方法调用 IocManager.RegisterAssemblyByConvention(typeof(AspNetCoreAppApplicationModule).Assembly); 否则应用服务不会被注入到 Ioc 容器当中的。

使用 DryIoc 替换 Abp 的 DI 框架

5.2 无法获取拦截器真实类型

该问题主要出在拦截器里面,因为在 DryIoc 当中如果某个类型绑定了多个拦截器,那么就会形成一个层级关系。类似于下面截图的这样:

使用 DryIoc 替换 Abp 的 DI 框架

所以如果你需要在外层的拦截器获取真实对象,目前只能通过递归来解决该问题。

public static Type GetUnproxiedType(object instance) { if (instance is IProxyTargetAccessor proxyTargetAccessor) { var newInstance = proxyTargetAccessor.DynProxyGetTarget(); return GetUnproxiedType(newInstance); } return instance.GetType(); }

然后使用方式如下:

public void Intercept(IInvocation invocation) { _authorizationHelper.Authorize(invocation.MethodInvocationTarget, TypeExtensions.GetUnproxiedType(invocation.Proxy)); invocation.Proceed(); }

该问题我在 Github 上面已经向作者提出,作者反馈正在解决。

六、结语

虽然通过文章看起来整个过程十分简单轻松,但是博主当时在操作的时候遇到了不少的坑。结合博主之前关于 Abp 源码分析的文章,你可以更加地了解 Abp 整个框架的结构。

通过这种方式,你除了可以将 DI 框架换成 DryIoc 之外,你也可以替换成你喜欢的其他 DI 框架。

在 Abp vNext 当中的设计Ioc 容器是可以很方便替换的,你可以更加方便地替换 Ioc 容器,就不需要像现在这样麻烦。

PS: 官方就有针对于 AutoFac 与 Castle Windsor 的扩展。

改造完成的代码与 DEMO 的 GitHub 地址:https://github.com/GameBelial/Abp-DryIoc.git

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyypz.html