ABP之依赖注入
写在开头
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对于生命周期管理提供了两种方式。
- 手工注入
系统提供了一生命周期的枚举类型: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参数

- 系统自动识别
系统识别的方式主要就对整个程序集进行注入,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之依赖注入的更多相关文章
- ABP的依赖注入
目录 说说ABP的依赖注入 代码追踪 说说ABP的依赖注入 上篇abp运行机制分析分析了ABP在启动时,都做了那些事:这篇我们来说说ABP的最核心的一部分:依赖注入(DependencyInjecti ...
- ABP框架 - 依赖注入
文档目录 本节内容: 什么是依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManag ...
- (译)ABP之依赖注入
原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...
- Asp.Net Core 3.1 Api 集成Abp项目依赖注入
Abp 框架 地址https://aspnetboilerplate.com/ 我们下面来看如何在自己的项目中集成abp的功能 我们新建core 3.1 API项目和一个core类库 然后 两个项目都 ...
- ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP源码分析六:依赖注入的实现
ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...
- ABP理论学习之依赖注入
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...
- ABP依赖注入
ABP依赖注入 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.N ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第四节--仓储,服务,服务接口及依赖注入
在ABP框架中,仓储,服务,这块算是最为重要一块之一了.ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块,一个程序集可看成一个模块, 一个模块可以通过一个类来定义这个模块,而给定义这 ...
随机推荐
- Android—初识AsyncTask
AsyncTask是用来处理一些后台的比较耗时的任务,给用户带来良好的体验.AsyncTask扩展Thread,增强了与主线程的交互能力. 首先介绍AsyncTask中定义的以下几个方法: onPre ...
- 用户故事驱动的敏捷开发 – 2. 创建backlog
本系列的第一篇[用户故事驱动的敏捷开发 – 1. 规划篇]跟大家分享了如何使用用户故事来帮助团队创建需求的过程,在这一篇中,我们来看看如何使用这些用户故事和功能点形成产品backlog.产品backl ...
- 转载文章-----Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)
转载地址:http://www.cnblogs.com/leaven/p/3718361.html 最近需要画uml图,之前用的是Rose 2003版的,由于好久没进去了,结果发现原来的激活又失效了, ...
- MySQL错误日志总结
MySQL错误日志是记录MySQL 运行过程中较为严重的警告和错误信息,以及MySQL每次启动和关闭的详细信息.错误日志的命名通常为hostname.err.其中,hostname表示服务器主机名. ...
- SQL Challenge ——快速找到1-100之间缺失的数
有个经典的题目:1-100之间的数字(不重复)存放在表里,共95行一列,但是里面缺了5个数字,怎么用SQL最快找出那五个数字. 我们先来看看Oracle数据库如何实现,如下所示,我们先准备测试环境和数 ...
- 计算节点宕机了怎么办?- 每天5分钟玩转 OpenStack(43)
Rebuild 可以恢复损坏的 instance. 那如果是宿主机坏了怎么办呢? 比如硬件故障或者断电造成整台计算节点无法工作,该节点上运行的 instance 如何恢复呢? 用 Shelve 或者 ...
- C语言猜拳游戏
2016年最后一篇文章 今天闲来无事Google了一段C语言写的猜拳游戏的代码(本人水平比较低,几乎是刚入门),我没做什么修改.这个switch语句里面对result的处理让我眼前一新,原来是这么玩的 ...
- 012.对netmap API的解读
一.简要说明: 1.netmap API主要为两个头文件netmap.h 和netmap_user.h ,当解压下载好的netmap程序后,在./netmap/sys/net/目录下,本文主要对这两个 ...
- 设置DIV可编辑
<div id="move" contentEditable="true">可编辑</div> 设置contentEditable属性可 ...
- Xcode 6、7 打包
从 Xcode 6 开始,打包需要开发者帐号添加到授权帐号列表里. 现实情况是作为公司开发工作者,很少能获此殊荣. 解决之道: 用 Xcode 6/7 照常打包,生成 *.xcarchive 文件,然 ...