拙网论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 195|回复: 0

使用 DryIoc 替换 Abp 的 DI 框架

[复制链接]

949

主题

1001

帖子

3736

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3736
发表于 2020-6-3 10:38:38 | 显示全部楼层 |阅读模式

https://www.cnblogs.com/myzony/p/9986947.html

一、背景#
你说我 Castle Windsor 库用得好好的,为啥要大费周章的替换成 DryIoc 库呢?那就是性能,DryIoc 是一款优秀而且轻量级的 DI 框架,整个项目代码就两个文件,加起来代码 1 万行左右(PS: 大部分都是注释)。
在各个 Ioc 容器的 性能评测 当中,DryIoc 以其优异的性能成为我选择使用他的原因。Abp 使用的 Castle Windsor 在解析复杂对象的时候,速度非常慢,而替换为 DryIoc 之后速度可以提升 150% 以上。
【注意】
本文仅对 .NET Core 相关的库进行更改并测试,.NET Framework 相关的库并没有进行修改测试。
二、准备#
你需要准备如下原料:
  • Abp 源码 一份。
  • 测试用的项目一份。
  • Visual Studio 2017 或者 Rider 一份。
  • .NET 程序猿一枚。
三、分析#
首先,Abp 框架的大部分动作基本上都是通过 IIocManager 这个接口对象进行实现的,它抽象了一层作为一个 DI 框架的操作类。它的默认实现是使用的 Castle Windsor 来进行组件的注入与解析,所以我们只需要将其改为使用 DryIoc 的容器其进行操作即可。
其次,在 Abp 框架的很多地方都有用到 Castle Windsor 的 IWindsorContainer 对象,但一般用到该方法的地方都是注入或者绑定组件注册事件,这些我们都可以重新实现的。
做完了以上的工作仅仅是代表我们的 Abp 的所有组件都可以通过 DryIoc 来进行注册和解析,不过要和 ASP.NET Core 集成的话,还需要 IServiceProvider 的适配器,针对于适配器 DryIoc 也给我们提供了,拿来用即可。
所以,我们基本确定了需要变更的项目主要是 Abp 这个核心库,还有 Abp.AspNetCore 这个子模块。除了前面两个比较重要的模块之外,还有 Abp.EntityFrameworkCore 相关的库也需要变更,这是因为他们内部都直接使用到了 IWindsorContainer 对象对容器进行操作的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|抱朴守拙BBS

GMT+8, 2025-5-25 22:34 , Processed in 0.210300 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表