写在开头

ABP开源项目最近有点小火,还开展了线下活动。本着学习DDD的心态与学习开源代码的的好奇,我也看了一遍ABP源码,在此将自己学习ABP的一些心得记录下来。

作为核心的IoC

作为一种解耦的方式,一些IoC框架就成了项目了核心。比如蒋金楠的VideoMall与陈青阳的Byteart Retail项目都是使用Unity。而ABP则是使用Castle。

Register与Resolve

Register与Reslove是IoC基本功能,向容器中注类型对应关系再向容器按注入规则索取对象实体。ABP为Register与Resolve分别定义接口:IIocRegistrar、IocResolver,再由IIocManager继承这两个接口,所以在IIocManager中统一了Register与Resolve,其中IIocManger中定义了IWindsorContainer。再由IocManager去实现IIoCManager.这样就形成了一个完整的, Register与Resolve。类结构如下:

其中,IoCManager当中用了单例去维持Register内容。

生命周期

ABP对于生命周期管理提供了两种方式。

  1. 手工注入

系统提供了一生命周期的枚举类型:DependencyLifeStyle

    /// <summary>
/// Lifestyles of types used in dependency injection system.
/// </summary>
public enum DependencyLifeStyle
{
/// <summary>
/// Singleton object. Created a single object on first resolving
/// and same instance is used for subsequent resolves.
/// </summary>
Singleton, /// <summary>
/// Transient object. Created one object for every resolving.
/// </summary>
Transient
}

再IIoCResgister接口中重载了四个方法Register都有DependencyLifeStyle参数

  1. 系统自动识别

系统识别的方式主要就对整个程序集进行注入,ABP提供了两个有关生命周期的接口,分别是:ISingletonDependency与ITransientDependency

同时IIoCRegister接口中有两个RegisterAssemblyByConvention方法,

这两个方法都用到了Assembly作为参数。

关于这种方式的注入ABP提供了一个Assembly容器接口:IConventionalRegistrationContext与其默认实现ConventionalRegistrationContext,一个Assembly解析接口:IConventionalDependencyRegistrar及其默认实现BasicConventionalRegistrar,还有一配置ContextConventionalRegistrationConfig

这两个接口与一个配置类共同解析程序集中可依赖注入的类型。

其中主要解析与注入工作由IConventionalDependencyRegistrar中的RegisterAssembly方法完成,其具体实现为:

public void RegisterAssembly(IConventionalRegistrationContext context)
{
//Transient
context.IocManager.IocContainer.Register(
Classes.FromAssembly(context.Assembly)
.IncludeNonPublicTypes()
.BasedOn<ITransientDependency>()
.WithService.Self()
.WithService.DefaultInterfaces()
.LifestyleTransient()
); //Singleton
context.IocManager.IocContainer.Register(
Classes.FromAssembly(context.Assembly)
.IncludeNonPublicTypes()
.BasedOn<ISingletonDependency>()
.WithService.Self()
.WithService.DefaultInterfaces()
.LifestyleSingleton()
); //Windsor Interceptors
context.IocManager.IocContainer.Register(
Classes.FromAssembly(context.Assembly)
.IncludeNonPublicTypes()
.BasedOn<IInterceptor>()
.WithService.Self()
.LifestyleTransient()
);
}

在源代码当中我们可以看到对拦截器(IInterceptor)也有处理

ABP默认只提供两种生命周期类型:Singleton(单例),Transient(实例)两种,对于其他的类型暂时不知道怎么处理。

Resolve的Wrapper

ABP为Resolve提供一个Wrapper,这个Wrapper的主要是对容器对象的Dispose管理

在其实现DisposableDependencyObjectWrapper<T>中有体现:

    internal class DisposableDependencyObjectWrapper<T> : IDisposableDependencyObjectWrapper<T>
{
private readonly IIocResolver _iocResolver; public T Object { get; private set; } public DisposableDependencyObjectWrapper(IIocResolver iocResolver, T obj)
{
_iocResolver = iocResolver;
Object = obj;
} public void Dispose()
{
_iocResolver.Release(Object);
}
}

AbpCoreInstaller

AbpCoreInstaller主要实现了ABP自身的注入。

ABP之依赖注入的更多相关文章

  1. ABP的依赖注入

    目录 说说ABP的依赖注入 代码追踪 说说ABP的依赖注入 上篇abp运行机制分析分析了ABP在启动时,都做了那些事:这篇我们来说说ABP的最核心的一部分:依赖注入(DependencyInjecti ...

  2. ABP框架 - 依赖注入

    文档目录 本节内容: 什么是依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManag ...

  3. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  4. Asp.Net Core 3.1 Api 集成Abp项目依赖注入

    Abp 框架 地址https://aspnetboilerplate.com/ 我们下面来看如何在自己的项目中集成abp的功能 我们新建core 3.1 API项目和一个core类库 然后 两个项目都 ...

  5. ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  7. ABP理论学习之依赖注入

    返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...

  8. ABP依赖注入

    ABP依赖注入 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.N ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第四节--仓储,服务,服务接口及依赖注入

    在ABP框架中,仓储,服务,这块算是最为重要一块之一了.ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块,一个程序集可看成一个模块, 一个模块可以通过一个类来定义这个模块,而给定义这 ...

随机推荐

  1. Eclipse 常用快捷键 For MAC

    Eclipse 常用快捷键 For MAC Option + Command + X: 运行Command + O:显示大纲Command + 1:快速修复Command + D:删除当前行Comma ...

  2. OC 面试问题汇总

    OC 问题汇总: 1. 你如何理解 iOS 内存管理   1. new alloc copy retain这些对象我们都要主动的release或者 autorelease   2. 如果是类方法创建的 ...

  3. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  4. CYQ.Data 数据层框架 CYQ.Data 数据框架 使用篇四 MAction 增删改

    本篇内容概要 本篇继续上一篇内容,本节介绍所有增删改的相关操作. 1:添加数据 Insert方法 2:删除数据 Delete方法 3:更新数据 Update方法 一:添加操作 方法原型: public ...

  5. Redis 支持的5种数据结构

    redis的崛起绝非偶然,它确实有自己的新东西在里面,它不像Memcached,只能将数据存储在内存中,它提供了持久化机制和数据同步,避免了宕机后的雪崩的问题,即服务器出现问题后,内存中保留的原始数据 ...

  6. SqlServer数据冗余的问题和解决

    1问题: 1>造成了存储空间的浪费. 2>更新异常.删除异常. 所以一般情况不允许在表中出现数据冗余. 2怎么解决? 把原来表中的数据拆分成多个表来存储. 当把表中的信息拆分成多个表来存储 ...

  7. Webservice详解

    WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际) ...

  8. gcc中__builtin_return_address和__VA_ARGS__

    — Built-in Function: void * __builtin_return_address (unsigned int level) This function returns the ...

  9. win7升win10,初体验

    跟宿舍哥们聊着聊着,聊到最近发布正式版的win10,听网上各种评论,吐槽,撒花的,想想,倒不如自己升级一下看看,反正不喜欢还可以还原.于是就开始了win10的初体验了,像之前装黑苹果双系统一样的兴奋, ...

  10. Jenkins学习九:Jenkins插件之构建MSBuild

    Jenkins是Java语言编写的,一直好奇是否可以构建NET语言的项目,目前只了解到有一个插件MSBuild支持构建NET项目. 一.Jenkins安装插件MSBuild 二.VS构建CsharpH ...