ABP分析
文章平均质量分 77
git
sinolover
完成项目,就要软硬兼施
展开
-
【转】ABP源码分析四十七:ABP中的异常处理
ABP 中异常处理的思路是很清晰的。一共五种类型的异常类。AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationException异常就可以,无须做额外处理。这类异常往往是需要维护人员介入分析的。其他四个异常都在AbpController中被集中处理,处理分为两步:一,通过EventBus触发异常事件,相应的异常处理函数则处理异常。二,针对AbpValidationException,UserFriendlyExcepti原创 2021-01-27 16:23:52 · 1107 阅读 · 0 评论 -
【转】ABP源码分析四十六:ABP ZERO中的Ldap模块
通过AD作为用户认证的数据源。整个管理用户认证逻辑就在LdapAuthenticationSource类中实现。LdapSettingProvider:定义LDAP的setting和提供DefautValue。主要提供配置访问AD数据库的账号信息。LdapSettings/ILdapSettings:通过settingManager获取LDAP settingsAbpZeroLdapModuleConfig/IAbpZeroLdapModuleConfig: ...原创 2021-01-27 16:23:37 · 357 阅读 · 0 评论 -
【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块
AbpZeroDbContext:配置ABP.Zero中定义的entity的DbsetEntityFrameworkModelBuilderExtensions:给PrimitivePropertyConfiguration添加了扩展方法用于创建Index。AbpZeroDbModelBuilderExtensions:给DbModelBuilder添加了扩展方法用于表的重命名。AbpZeroEntityFrameworkModule:很明显Abp Zero模块中的...原创 2021-01-27 16:23:13 · 325 阅读 · 0 评论 -
【转】ABP源码分析四十四:ZERO的配置
ABP Zero模块中需要配置的地方主要集中在三块:配置静态的role,配置外部认证源,以及配置本地化语言和资源。UserManagementConfig/IUserManagementConfig:定义了一个配置项,用于配置外部认证源。默认情况下,ABP Zero使用AbpUser表作为身份认证的数据源,但是我们也可以使用其他数据源做身份认证,比如AD或其他数据库。这种情况下,就需要通过UserManagementConfig将这个外表身份认证数据源添加进来。后文关于Ldap身份认证的..原创 2021-01-25 18:00:50 · 420 阅读 · 0 评论 -
【转】ABP源码分析四十三:ZERO的本地化
ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能。其通过数据库保存本地化语言及其资源。ApplicationLanguage:代表本地化语言的实体类。一种语言就是一个ApplicationLanguage实例。ApplicationLanguageProvider:实现了ILanguageProvider接口,通过IApplicationLanguageManager实例设置DefaultLanguage和获取应用所配置的Language的列表..原创 2021-01-27 16:21:25 · 446 阅读 · 0 评论 -
【转】ABP源码分析四十二:ZERO的身份认证
ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展。同时重写了ABP核心模块中的permission功能,以实现授权。注意:ABP仅仅使用了Asp.Net Identity的身份认证功能,但没有使用Asp.Net Identity中的基于role和Claim的授权。ABP Zero 中扩展的Asp.Net Identity实体类: AbpUser, AbpRole。AbpUser: 代表user的Entit.原创 2021-01-25 18:00:44 · 523 阅读 · 0 评论 -
【转】ABP源码分析四十一:ZERO的Audit,Setting,Background Job
AuditLog: 继承自Entity<long>的实体类。封装AuditLog的信息。AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信息保存到数据库的功能。其通过IRepository<AuditLog, long>实例完成对数据库的操作。BackgroundJobStore: 实现了IBackgroundJobStore接口,通过IRepository<BackgroundJobInfo, long&g...原创 2021-01-25 18:00:38 · 318 阅读 · 0 评论 -
【转】ABP源码分析四十:ZERO的Application和Tenant
ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting management, language management, audit logging等核心功能。ABP中的这些功能具体实现都依赖外部的持久层,所以ABP框架中仅仅定义了接口和一些空的实现。而对这些功原创 2021-01-25 18:00:33 · 332 阅读 · 0 评论 -
【转】ABP源码分析三十九:ABP.Hangfire
ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的。HangfireBackgroundJobManager:实现了接口IBackgroundJobManager中的方法EnqueueAsync,通过HangfireBackgroundJob完成Enqueue。重写了BackgroundWorkerBase中的Start和WaitToStop方法。AbpHangfireCon..原创 2021-01-25 18:00:27 · 396 阅读 · 0 评论 -
【转】ABP源码分析三十八: ABP.Web.Api.OData
如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识。API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController,实现了Controller代码的常用。AbpODataEntityController<TEntity, TPrimaryKey>:使用ABP的repository和UOW完成实体的CRUD操作。AbpODataEntityController<TEntity>:主键为int类型的AbpODataE原创 2021-01-25 18:00:22 · 231 阅读 · 0 评论 -
【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API
ABP提供Script Proxy WebApi为所有的Dynamic WebApi生成访问这些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。这些个代理就是javascript脚本,通过这些代理可以简单的访问Dynamic webApi。如下实例演示一个最基本的应用场景。首先通过Script Proxy WebApi获取所有Dynamic WebApi的angular代理。假设你有一个ApplicationService如下,并且你为该Appli..原创 2021-01-25 18:00:14 · 335 阅读 · 0 评论 -
【转】ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系。除了动态webapi,ABP必然是支持使用传统的webApi。ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net webApi。AbpApiController:这是一个抽象基类,继承自ApiController,是AB WebApi系统中所有controller的基类。如下图中,其封装了ABP核心模块中提供的大多数的功能对象。同时实现了一些公共的方法。它有四个派生类:DynamicApiController<T&原创 2021-01-25 18:00:09 · 413 阅读 · 0 评论 -
【转】ABP源码分析三十五:ABP中动态WebAPI原理解析
动态WebAPI应该算是ABP中最Magic的功能之一了吧。开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能,这应该算是对DRY的最佳诠释了. 如下图所示,一行代码就为所有实现了IApplicationService的类型,自动创建对应的动态WebAPI.这么Magic的功能是如何实现的呢?本文为你揭开其Magic的外表。你会发现,实现如此Magic的功能,最关键的代码只有四行。先思考一个问题:如.原创 2021-01-25 18:00:03 · 1041 阅读 · 0 评论 -
【转】ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务:第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用。第二,一些常见的基础功能的实现。AbpController:这是一个抽象基类,继承自MVC Controller,是ABP系统中所有controller的基类。如下图中,其封装了ABP核心模块中提供的大多数的功能。同时实现了一些公共的方法。它有三个派生类:AbpAppViewController,AbpScripts.原创 2021-01-22 10:59:36 · 450 阅读 · 0 评论 -
【转】ABP源码分析三十三:ABP.Web
ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现。AbpWebApplication: 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在Application_Start完成AbpBootstrapper的初始化。整个ABP系统的初始化就是通过AbpBootstrapper完成初始化的。二,在Application_BeginRequest设置根据request或cookie中的Culture信息,完成当前工作线程的CurrentCultu.原创 2021-01-22 10:59:24 · 426 阅读 · 0 评论 -
【转】Castle中AdditionalInterfaces用法介绍
首先见下图(图一),其中FooController是一个没有实现任何Interface的空类。需要实现的效果是:通过FooController对象调用FooService的Do方法。设置这一不常见的场景主要是为了说明Castle中AdditionalInterfaces的用法。这个场景诡异的地方在于FooController是一个空类,其类和对象都没什么可供调用的?假如FooController也有一个Do方法,那么通过Castle给FooController对象添加拦截器,就可以轻松实现上述的效果。原创 2021-01-27 16:26:46 · 219 阅读 · 0 评论 -
【转】ABP源码分析三十二:ABP.SignalR
RealtimeRealtime是ABP底层模块提供的功能,用于管理在线用户。它是使用SignalR实现给在线用户发送通知的功能的前提IOnlineClient/OnlineClient: 封装在线用户的信息OnlineClientManager/IOnlineClientManager: 用于提供基本维护在线用户的方法。其内部维护了一个字典来保存在线的客户信息。SingalRSignalRRealTimeNotifier:实现了给在线用户发送通知的功能。其从...原创 2021-01-22 10:58:52 · 513 阅读 · 0 评论 -
【转】ABP源码分析三十一:ABP.AutoMapper
这个模块封装了Automapper,使其更易于使用。下图描述了改模块涉及的所有类之间的关系。AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttribute:这三个attribute用于标注一个类到另外一个类的map方向。AutoMapperHelper: 通过调用Automapper的API,根据类的AutoMap的特性完成类型之间的Map.AbpAutoMapperModule: 1. 查找项目中所有标注了...原创 2021-01-22 10:58:20 · 306 阅读 · 0 评论 -
【转】ABP源码分析三十:ABP.RedisCache
ABP通过StackExchange.Redis类库来操作Redis数据库。AbpRedisCacheModule:完成ABP.RedisCache模块的初始化(完成常规的依赖注入)AbpRedisCacheConfig:定义了connectionStringKey和databaseIdAppSetting的值。这两个值对象redis在web.config中的key值。ABP.RedisCache模块通过读取web.config来获取redis的配置。IAbp...原创 2021-01-22 10:58:09 · 441 阅读 · 0 评论 -
【转】ABP源码分析二十九:ABP.MongoDb
这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作。 这个module通过引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy类库来操作MongoDb. 当项目不需要依赖于关系型数据库时,可以考虑引入MongoDB以及这个module。ABP.MongoDb模块涉及到的接口和类如下,结构清晰,简单。IAbpMong.原创 2021-01-22 10:58:00 · 588 阅读 · 1 评论 -
【转】ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的)。一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了。原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库的必然要注入efUnitOfWork. 而注入了efUnitOfWork就不能在注入MemoryDbUnitOfWork了。MemoryDatabase:这是一个单例。ABP通过Dictionary<Type, object>+lock作为数据结构.原创 2021-01-22 10:57:45 · 272 阅读 · 1 评论 -
【转】ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定义了Repository常见的方法AbpRepositoryBase:实现了IRepository接口的常见方法EfRepositoryBase:实现了AbpRepositoryBase中定义的抽象方法:GetAll,Insert,Delete,Update。在实际项目中的RepositoryBase都是从EfRepositoryBase继承的IDbContextProvider/UnitOfWorkDbContextProvider:...原创 2021-01-22 10:57:29 · 360 阅读 · 0 评论 -
【转】ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能AbpSessionAbpSession: 目前这个和CLR的Session没有什么直接的联系。当然可以自定义的去实现IAbpSession使之与CLR的Session关联IAbpSession:定义如下图中的四个属性。NullAbpSession:IAbpSession的一个缺省实现,给每个属性都给予null值,无实际作用ClaimsAbpSession:实现了从ClaimsPrincipal/ClaimsIdentity中原创 2021-01-22 10:56:25 · 168 阅读 · 0 评论 -
【转】ABP源码分析二十五:EventBus
IEventData/EventData: 封装了EventData信息,触发event的源对象和时间IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法。EventBus定义了一个Dictionary容器来存放事件和处理该事件的对象(其实不是对象而是Factory,暂且这样理解无妨)。其key是Type:在ABP使用Type表示不同的事件,具体而言这个type是EventData派生类的类型。EventData在ABP中有两个作用:第一用于封装事件数据,第二,原创 2021-01-22 10:53:23 · 614 阅读 · 0 评论 -
【转】ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息。注意和Notification 的区别,如果把Notification看成是具体的消息内容,NotificationDefinition则是对这个消息自身的定义(可理解为消息的类型)。INotificationDefinitionManager:该接口定义根据name返回NotificationDefinition的一些方法NotificationDefinitionM...原创 2021-01-21 11:27:28 · 209 阅读 · 0 评论 -
【转】ABP源码分析二十三:Authorization
Permission:用于定义一个Permission,一个permission可以包含多个子Permission.PermissionDictionary:继承自Dictionary<string, Permission>类,很明显是一个用于存储permission对象的字典。IPermissionDefinitionContext/PermissionDefinitionContextBase: 这对接口和实现用于新建一个Permission到PermissionDicti.原创 2021-01-21 11:26:40 · 443 阅读 · 0 评论 -
【转】ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性。MenuItemDefinition:封装了主菜单的子菜单的属性。子菜单可以引用其他子菜单构成一个菜单树UserMenu/UserMenuItem:封装了用于显示给用户的菜单/以及子菜单集合。 ABP通过MenuDefinition/MenuItemDefinition构成了完整的系统菜单集合(超集)。而UserMenu/UserMenuItem只构成用户所能访问的菜单集合,并且其DisplayName是本地化以后的DisplayNa.原创 2021-01-21 11:26:01 · 208 阅读 · 0 评论 -
【转】ABP源码分析二十一:Feature
Feature是什么?Feature就是对function分类的方法,其与function的关系就比如Role和User的关系一样。ABP中Feature具有以下属性: 其中最重要的属性是name,用以表示feature的Identity,一个feature拥有一个name. 一个Feature可以有一组子Features,从而构成Feature树。FeatureDictionary: 其本身继承自Dictionary。其作用就是把一个Feature及其Child Features从..原创 2021-01-21 11:24:59 · 538 阅读 · 0 评论 -
【转】ABP源码分析二十:ApplicationService
IApplicationService: 空接口,起标识作用。所有实现了IApplicationService 的类都会被自动注入到容器中。同时所有IApplicationService对象都会被注入一些拦截器(例如:auditing, UnitOfWork等)以实现AOPAbpServiceBase:抽象类,封装了对一些通用功能的调用。比如Setting,Localization和UnitOfWork功能。ApplicationService: 作为所有其他appservice的基类。其封装了对A.原创 2021-01-18 10:40:07 · 334 阅读 · 0 评论 -
【转】ABP源码分析十九:Auditing
审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作。AuditInfo:定义如下图中需要被Audit的信息。AuditedAttribute: 用于标识一个方法或一个类的所有方法都需要启用Auditing功能。DisableAuditingAttribute:用于标识一个方法或一个类的所有方法都需要关闭Auditing功能。IMvcControllersAuditingConfigurat...原创 2021-01-15 10:39:17 · 594 阅读 · 0 评论 -
【转】ABP源码分析十八:UI Inputs
以下图中描述的接口和类都在Abp项目的Runtime/Validation,UI/Inputs目录下的。在当前版本的ABP(0.83)中这些接口和类并没有实际使用到。阅读代码时可以忽略,无需浪费时间去寻找其是如何被ABP使用的(本文的目的)。这些接口和类最终都是通过IInputType被Feature类引用。搜遍ABP源码,没有发现Feature是如何使用这个IInputType的。最后在官网上发现作者下面的这段话,最终验证了我的想法:这一切都无卵用。Note that; This input t.原创 2021-01-15 10:39:10 · 154 阅读 · 0 评论 -
【转】ABP源码分析十七:DTO 自动校验的实现
对传给Application service对象中的方法的DTO参数,ABP都会在方法真正执行前自动完成validation(根据标注到DTO对象中的validate规则)。 ABP是如何做到的? 思路无外乎通过Castle的拦截器实现AOP。本文主要分析ABP是如何设计。Ivalidate: 空接口,用于标识该接口的对象在使用前需要被validate先。IInputDto:用于输入参数的DTO,该接口继承自Ivalidate。所以所有作为输入参数的DTO都会在使用前先validate。ICus原创 2021-01-15 10:39:04 · 408 阅读 · 0 评论 -
【转】ABP源码分析十六:DTO的设计
IDTO:空接口,用于标注Dto对象。ComboboxItemDto:用于combobox/list中Item的DTONameValueDto<T>/NameValueDto:用于name value键值对的DTO, name为string类型, value为泛型或string类型。Entity DtoIEntityDto<TPrimaryKey>:基于Entity的DTO,支持泛型类型的主键。IEntityDto:基于Entity的DTO,只支持i.原创 2021-01-15 10:38:57 · 510 阅读 · 0 评论 -
【转】ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribute's value from an Xml node. JsonExtensions...原创 2021-01-15 10:38:50 · 206 阅读 · 0 评论 -
【转】ABP源码分析十四:Entity的设计
IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型IEntity: 封装了PrimaryKey:Id,这是一个int类型Entity<TPrimaryKey>:支持主键是泛型类型的EntityEntity:支持主键是int类型的EntityIHasCreationTime: 封装了CreationTimeICreationAudited: 封装了CreatorUserId,这个是long类型Creatio..原创 2021-01-15 10:38:43 · 407 阅读 · 0 评论 -
【转】ABP源码分析十三:缓存Cache实现
ABP中有两种cache的实现方式:MemroyCache 和 RedisCache. 如下图,两者都继承至ICache接口(准确说是CacheBase抽象类)。ABP核心模块封装了MemroyCache 来实现ABP中的默认缓存功能。 Abp.RedisCache这个模块封装RedisCache来实现缓存(通过StackExchange.Redis这个类库访问redis)。ICache:缓存的接口。以string类型的key缓存object类型的value.ICache.Get方法有两..原创 2021-01-15 10:38:13 · 528 阅读 · 0 评论 -
【转】ABP源码分析十二:本地化
本文逐个分析ABP中涉及到localization的接口和类,以及相互之间的关系。本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单。另一个是语言对应得本地化资源(Localization)的管理,这部分稍显复杂。LanguageInfo:用于封装language的基本信息。ILanguageProvider:接口定义一个返回本地化语言集合的方法。这里使用接口做隔离是有必要的,因为ABP底层框架的DefaultLanguageProvider只是返回通过代码har.原创 2021-01-15 10:36:37 · 474 阅读 · 0 评论 -
【转】ABP源码分析十一:Timing
Timing这个简单实用的功能主要用于以统一的方式表示时间。因为ABP中有大量的module,还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的。IClockProvider:提供获取当前时间和标准化时间的接口。UtcClockProvider:实现了以UTC为标准时间的IClockProviderLocalClockProvider:实现了以Local为标准时间的IClockProviderClock:封装了IClockProvider原创 2021-01-15 10:35:52 · 232 阅读 · 0 评论 -
【转】ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能。通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类在容器中对应的ComponentModel的Interceptors集合中。总结一句话就是,UOW的功能是通过自定义Castle拦截器来实现的。本文主要介绍ABP核心框架中的UnitOfWork的实现,后续会分别介绍ABP其他模块是如何具体实现IUnitOfWork的如图,AbpKernelModul.原创 2021-01-14 09:14:55 · 1480 阅读 · 0 评论 -
【转】ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob)。ABP通过BackgroundWorkerManager来管理BackgroundJobManager,然后通过BackgroundJobManager来管理BackgroundJob。BackgroundJob就代表一个真正的后台任务。这两个模块是在ABPKernelModule的PostInitialize完成初始化的。后台工作者模块首先浏览下后台工作..原创 2021-01-14 09:11:07 · 1255 阅读 · 0 评论