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框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块,一个程序集可看成一个模块, 一个模块可以通过一个类来定义这个模块,而给定义这 ...
随机推荐
- JS原生事件处理(跨浏览器)
一.关于获取事件对象 FF有点倔强,只支持arguments[0],不支持window.event.这次真的不怪IE,虽然把event作为window的属性不合规范,但大家都已经默许这个小问题存在了, ...
- scanf的拓展用法——匹配特定字符
scanf的基本用法除了常规的输入操作外还有一些特殊的用法,使用这些用法可以很方便的在输入中读取想要的数据 1.限制输入数据的长度 这个应该算不上拓展用法,大多数读者应该都曾经使用过,这里简单提一下 ...
- Codeforces gym101612 L.Little Difference(枚举+二分)
传送:http://codeforces.com/gym/101612 题意:给定一个数n(<=1e18),将n分解为若干个数的成绩.要求这些数两两之间的差值不能大于1. 分析: 若n==2^k ...
- SQL简介及MySQL的安装目录详解
一,SQL简介 1,数据库定义语言(DDL) ①create:用于创建数据库.表.索引.视图等: ②alter:用于修改数据库.表.索引.视图等: ③drop:用于删除数据库.表.索引.视图.用户等. ...
- [Leetcode]146.LRU缓存机制
Leetcode难题,题目为: 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key ...
- Hadoop集群搭建中时间同步步骤
一.设置主节点时间服务器的时区 二.在每一个节点上检查是否安装时间服务ntp 三.在主节点上配置时间同步的相关文件 四.在其他从节点上配置与主节点时间同步的脚本 一.设 ...
- Oracle VM VirtualBox启动后莫名奇妙的报错
VirtualBox软件无法启动: 参考解决:http://blog.csdn.net/a_ssimi/article/details/52002939 修改兼容性:http://blog.csdn. ...
- 前端安全 -- XSS攻击
XSS漏洞是最广泛.作用最关键的web安全漏洞之一.在绝大多数网络攻击中都是把XSS作为漏洞链中的第一环,通过XSS,黑客可以得到的最直接利益就是拿到用户浏览器的cookie,从而变相盗取用户的账号密 ...
- Strom的trident单词计数代码
/** * 单词计数 */ public class LocalTridentCount { public static class MyBatchSpout implements IBatchSpo ...
- c++三维静态数组的定义与作为函数的传递
在c++中,我们可以定义三维数组,并且可以将之作为参数直接传递. 定义: #include <iostream> #include <windows.h> using name ...