随笔 - 54, 文章 - 0, 评论 - 14, 阅读 - 21万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在AbpBootstrapper中的两个至关重要的属性:IIocManager 和 IAbpModuleManager 

复制代码
 1   public class AbpBootstrapper : IDisposable
 2     {
 3         /// <summary>
 4         /// Gets IIocManager object used by this class.
 5         /// </summary>
 6         public IIocManager IocManager { get; private set; }
 7 
 8         /// <summary>
 9         /// Is this object disposed before?
10         /// </summary>
11         protected bool IsDisposed;
12 
13         private IAbpModuleManager _moduleManager;
14 //.........
15 }
View Code
复制代码

IIocManager内部包装了一个Castle的依赖注入容器IWindsorContainer(abp使用的是Castle windor框架,在此框架的基础上做了一些封装),

所有类型的注册,解析还有后面实现的AOP机制的拦截器都是注册在该容器中的,将具体的注册还有解析功能分别包含在其父接口IIocRegistrar和IIocResolver中

复制代码
 1  public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable
 2     {
 3         /// <summary>
 4         /// Reference to the Castle Windsor Container.
 5         /// </summary>
 6         IWindsorContainer IocContainer { get; }
 7 
 8         /// <summary>
 9         /// Checks whether given type is registered before.
10         /// </summary>
11         /// <param name="type">Type to check</param>
12         new bool IsRegistered(Type type);
13 
14         /// <summary>
15         /// Checks whether given type is registered before.
16         /// </summary>
17         /// <typeparam name="T">Type to check</typeparam>
18         new bool IsRegistered<T>();
19     }
View Code
复制代码

其中IIocRegistrar类的类图如下:

 

1.AddConventionalRegistrar,

2.RegisterAssemblyByConvention(Assembly assembly),

3.RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config)

以上 三个方法需要特别注意:

 

第一个方法,AddConventionalRegistrar是向IocManager的一个私有泛型集合List<IConventionalDependencyRegistrar>注册注册机制,这句话不太好明白,简单说就是设定依赖注入模块的注入方式,

通常所有的Module类的预初始化方法中调用以决定哪些类型需要被注册(如果没有就无需调用),

比如在Abp程序集中的BasicConventionalRegistrar实现的就是搜索并注册指定的程序集中的所有实现了ITransientDependency,ISingletonDependency和IInterceptor的类并注册到依赖容器中,

 

第二,第三个方法执行真正的注册逻辑,

通常在一个个具体的Module的初始化方法中调用,传入当前Module所属的程序集,

迭代List<IConventionalDependencyRegistrar>将当前程序集作为参数执行注册,

第二,第三个方法的区别在于第三个方法多了一个ConventionalRegistrationConfig参数,以决定是否还需要搜索当前程序及中的IWindsorInstaller的实现类进行注册,默认是需要的。

 

IAbpModuleManager主要用于管理所有的模块默认也就是一个个的程序集(一个模块对应一个程序集),主要用于搜索到所有的Module以及他们的依赖Module,首先执行所有Module的PreInitialize方法再执行所有的Initialize,最后执行所有的PostInitialize,执行IAbpModuleManager的ShutdownModules时顺序颠倒依次执行所有具体Module的ShutDown方法。

 

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示