ABP的依赖注入
说说ABP的依赖注入
上篇abp运行机制分析分析了ABP在启动时,都做了那些事;这篇我们来说说ABP的最核心的一部分:依赖注入(DependencyInjection),以下简称DI;
DI的概念我就不说了,关键字出来的资料非常多了,这里就不说了,这里主要讨论的是ABP是如何做到自依赖注入的(self register)
读过ABP的依赖注入文档内容我们知道:当你想注入一个服务时,最佳实践是根据命名规范(Naming conventions)来命名,也就是说,加入你想注入一个叫IPersonAppService的服务类,那么你的实现接口的服务类就应该按照Naming conventions规则命名为PersonAppService或者是保留“PersonAppService”字样,改成"Profix+PersonAppService"就能实现self register;否则的话就只能通过另写代码显示的注册接口与实现类;
其实这不是ABP框架这么要求的,这是ABP附带的DI组件——Castle Windsor这么要求的;让我们来看看ABP框架的代码就知道了
代码追踪
阅读过ABP文档的人应该知道,自依赖注入的关键入口是你项目的WebApplication.Module类的初始化方法Initialize下的IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());顾名思义,就是注册当前运行程序集所有按照命名规范的实现接口类;我们来看看IocManager属性,F12我们知道这是一个接口类IIocManager,继续追踪可以看出IIocManager继承两个接口,一个是Ioc注册接口IIocRegistrar和Ioc解析接口IIocResolver并且之前提到的Naming conventions以及abp运行机制分析知道IocManager就是IIocManager的实现类:
public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable
{
IWindsorContainer IocContainer { get; }
new bool IsRegistered(Type type);
new bool IsRegistered<T>();
}
public class IocManager : IIocManager, IIocRegistrar, IIocResolver, IDisposable
{
.../
public void RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config);
public void RegisterAssemblyByConvention(Assembly assembly);
.../
}
public void RegisterAssemblyByConvention(Assembly assembly)内部调用了它的另一个重载函数RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config)并传一个默认规范注册选项配置,而这里配置类就仅仅只是设置一个是否自动按照命名规范注册接口实现类标识InstallInstallers,接着初始化ConventionalRegistrationContext上下文,然后遍历默认的规约注册器组注册去注册各种服务,最后根据InstallInstallers来判断是否调用self-register
public void RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config)
{
var context = new ConventionalRegistrationContext(assembly, this, config);
foreach (var registerer in _conventionalRegistrars)
{
registerer.RegisterAssembly(context);
}
if (config.InstallInstallers)
{
//这里这句话就是Castle Windsor在做的事,也就是按照命名规范实现自动注册服务关键所在
IocContainer.Install(FromAssembly.Instance(assembly));
}
}
上面这段代码有点要注意,就是foreach段,这里遍历一个注册器集合;这是在IocManager初始化时候就会初始化一个空的IConventionalDependencyRegistrar集合,然后在应用程序启动加载Module时就会增加一个默认实现类基础注册器BasicConventionalRegistrar,里面包含三种注册服务的细节——Transient,Singleton,Windsor Interceptors;
注入BasicConventionalRegistrar细节源代码如下:
public sealed class AbpKernelModule : AbpModule
{
public override void PreInitialize()
{
IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());
IocManager.Register<IScopedIocResolver, ScopedIocResolver>(DependencyLifeStyle.Transient);
IocManager.Register(typeof(IAmbientScopeProvider<>), typeof(DataContextAmbientScopeProvider<>), DependencyLifeStyle.Transient);
AddAuditingSelectors();
AddLocalizationSources();
AddSettingProviders();
AddUnitOfWorkFilters();
ConfigureCaches();
AddIgnoredTypes();
}
}
看到这里我相信ABP的依赖注入很清晰了;
下篇我们来说说ABP的缓存管理以及如何写自定义缓存管理类,学习下别人的框架是如何封装的,如何做到高可用,拓展性强的框架的
ABP的依赖注入的更多相关文章
- ABP框架 - 依赖注入
文档目录 本节内容: 什么是依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManag ...
- ABP之依赖注入
写在开头 ABP开源项目最近有点小火,还开展了线下活动.本着学习DDD的心态与学习开源代码的的好奇,我也看了一遍ABP源码,在此将自己学习ABP的一些心得记录下来. 作为核心的IoC 作为一种解耦的方 ...
- (译)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框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块,一个程序集可看成一个模块, 一个模块可以通过一个类来定义这个模块,而给定义这 ...
随机推荐
- tomcat单机多实例部署
最近在面试的过程中,一家公司在面试时提到了有关tomcat单机多实例部署的提问, 正好, 之前使用IntelliJ IDEA 13.1.4这款IDE开发web项目,在开发的过程中,因为有多个web项目 ...
- nginx官方文档 之 http负载均衡 学习笔记
一.负载均衡 算法 大致可以分两类: (1)不能保证用户的每一次请求都通过负载均衡到达同一服务器. (2)可保证用户的每一次请求都通过负载均衡到达同一服务器. 第二类的应用场景: 1.如果服务器有缓存 ...
- sync.Pool 资源池
sync.Pool type Pool struct { // 可选参数New指定一个函数在Get方法可能返回nil时来生成一个值 // 该参数不能在调用Get方法时被修改 New func() in ...
- System.Threading.ThreadAbortException: 正在中止线程
症状 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常.您可以使用 try-ca ...
- Flask 微博三方登录
1.进入微博开发平台(https://open.weibo.com/),注册账号,填写开发者信息 2.创建应用.创建应用完成后,可以在"我的应用 - 应用信息"中查看您所创建应用的 ...
- android开发学习——day2
简单了解了android stdio的操作方式,今天着手于探究活动(Activity) 了解了基本活动与手动创建活动的方法,了解了onCreate()方法,了解了创建和加载页面布局(layout) 新 ...
- 再学Java 之 HashMap的底层实现
今天参加欢聚时代的面试,我说我自己依靠自己的理解重新实现过HashMap.描述我自己的实现思想后,面试官问“hashmap”底层如果用数组不是效率比较低吗,不是更应该用红黑树吗?我一下子就蒙了.用数组 ...
- Vue2.0-token权限处理
token一种身份的验证,在大多数网站中,登录的时候都会携带token,去访问其他页面,token就想当于一种令牌.可以判断用户是否登录状态.本次页面是通过Element-ui搭建的登录界面 当用户登 ...
- 轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单 demo
最新版wangEditor: 配置说明:http://www.wangeditor.com/doc.html demo演示:http://www.wangeditor.com/wangEditor/d ...
- INTEST/EXTEST SCAN 的学习
intest scan的一些基本知识.INTEST scan指的是对IP 内部的scan cell的扫描测试,针对IP内部的flip-flop进行shift/capture的操作.和INTEST SC ...