ABP理论学习之发布说明】的更多相关文章

返回总目录 查看更详细信息以及下载源代码请查看原文档 ABP v0.9.2.0 | [更新日期:2016/6/6 11:21:28 ] 解决方案转换成xproj/project.json格式. 添加了Appveyor持续集成. 创建了EntityCache基类,可以轻松缓存实体了. 添加了可以用于对象与对象之间映射的可注入的IObjectMapper接口(在Abp.AutoMapper模块中实现). 修复获取实体和设置DateTime.Kind时的bug,提升了性能. 改善使用多个DbConte…
返回总目录 本篇目录 Ajax Notification Message UI block和busy 事件总线 Logging 其他工具功能 说在前面的话 不知不觉,我们送走了2015,同时迎来了2016.我相信,每一个人,都会在过去的一年有所失,但我更相信,我们所得到的更多.过去的就过去了,不要再计较了,但要从过去的各种不顺中汲取经验,这样,在全新的2016年里继续留下2015年遗憾的概率才会大大降低!祝大家在新的一年里,代码bug越来越少! 本来给这个ABP理论学习系列的预算时间是2016年…
返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过,呵呵,多么美好的大学时光啊!不过,现在想想,开篇介绍确实不怎么重要,它只是告诉我们今后我要开始讲什么了,主要讲什么,大概浏览下重点. 哦了,不扯了,时间不多了,干活! 本篇目录 介绍 快速样例 其他 启动模板 如何使用 介绍 我们总是基于不同的需求创建不同的应用,但是在一定程度上,总在反复地实现通用…
返回总目录 本篇目录 为何需要DTO 领域层抽象 数据隐藏 序列化和懒加载问题 DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射 帮助接口 DTO用于应用层和 展现层间的数据传输. 展现层调用具有DTO参数的应用服务方法,然后应用服务使用领域对象来执行一些特定的业务逻辑,最后返回给展现层一个DTO.因此,展现层完全独立于领域层.在一个理想的分层应用中,展现层不直接和领域对象打交道(仓储,实体...). 为何需要DTO 为每个应用服务方法创建一个DTO起初可能被看作是一项乏味而…
返回总目录 本篇目录 介绍 创建内嵌文件 暴露内嵌文件 使用内嵌文件 介绍 在一个web应用中,有供客户端使用的javascript,css,xml等文件.它们一般是作为分离的文件被添加到web项目中并发布.有时,我们需要将这些文件打包到一个程序集(类库项目,一个dll文件)中,作为内嵌资源散布到程序集中.ABP提供了一个基础设施使得这个很容易实现. 创建内嵌文件 我们首先应该创建一个资源文件并把它标记为内嵌的资源.任何程序集都可以包含内嵌的资源文件.假设我们有一个叫做"Abp.Zero.Web…
返回总目录 本篇目录 介绍 订阅通知 发布通知 用户通知管理者 实时通知 通知存储 通知定义 介绍 通知(Notification)用于告知用户系统中的特定事件.ABP提供了基于实时通知基础设施的发布订阅模型(pub/sub). 发送模型 给用户发送通知有两种方式: 首先用户订阅特定的通知类型,然后我们发布这种类型的通知,这种类型的通知会传递给所有已经订阅的用户.这就是发布订阅(pub/sub)模型. 直接给目标用户发送通知. 通知类型 通知类型也有两种: 一般通知:是任意类型的通知."如果一个…
返回总目录 本篇目录 框架 测试基 ABP已经发布在Nuget上,这里是所有包的列表. 框架 Abp Abp系统的核心包.所有其他的包都依赖这个包. Abp.Web 提供了MVC和Web API都使用的一些通用类和资源 Abp.Web.Resource Web层的资源(js,css...文件) Abp.Web.Mvc 提供一些ASP.NET MVC特定的类和资源 Abp.Web.Api 提供一些ASP.NET Web API特定的类和资源 Abp.EntityFramework 提供使用EF工作…
返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可能是不怎么用github,可能的原因就是英文不好.所以还是希望程序员多看看英文文档,一开始看得很慢不要紧,时间久了,速度绝对能上去.因为都是技术性的文章,没有特别难的语法,能让大家退而却步的最多是些生词,这个就要靠大家积累常见的词汇了,一些生僻词的话查一下意思,理解了那句话就可以过了. 跟ABP相关…
返回总目录 本篇目录 模块介绍 生命周期事件 模块依赖 自定义模块方法 模块介绍 ABP提供了构建模块并将这些模块组合起来创建应用的基础设施.一个模块可以依赖另一个模块.一般来说,一个程序集可以认为是一个模块.一个模块是由一个派生了AbpModule的类定义的.比如说我们在开发一个可以用在不同的应用中的博客模块.最简单的模块定义如下: public class MyBlogApplicationModule : AbpModule { public override void Initializ…
返回总目录 本篇目录 配置ABP 配置模块 为模块创建配置 为了在应用启动时配置ABP和模块,ABP提供了一个基础设施. 配置ABP 配置ABP是在模块的PreInitialize事件中完成的.下面的代码摘自Github上的Taskever(一个任务系统Demo): public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //为应用添加语言 Configuration.Loc…
返回总目录 本篇目录 什么是多租户 ABP中的多租户 什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个租户是一组共享该软件实例特定权限的用户.有了多租户架构,软件应用被设计成为每个租户提供一个 专用的实例包括该实例的数据的共享,还可以共享配置,用户管理,租户自己的功能和非功能属性.多租户和多实例架构相比,多租户分离了代表不同的租户操作的多个实例. 多租户用于创建Saas(Software as-a servi…
返回总目录 如果你的应用中使用了OWIN,那么需要在主项目(一般来说是指Web项目)中添加Abp.Owin的nuget包,然后像下面那样在OWIN的 Startup文件中调用 UseAbp()扩展方法: [assembly: OwinStartup(typeof(Startup))] public class Startup { public void Configuration(IAppBuilder app) { app.UseAbp(); //your other configuratio…
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什么是依赖注入 维基百科说:"依赖注入是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分.该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则.与服务定位器模式形…
返回总目录 本篇目录 介绍 注入Session 使用Session属性 介绍 当应用程序要求用户登录时,那么应用程序也需要知道当前用户正在执行的操作.虽然ASP.NET本身在展现层提供了Session对象,但ABP也提供了在任何需要获得当前用户和租户的地方都可以使用的IAbpSession接口. 关于IAbpSession 为了获得实际的session信息,必须要实现IAbpSession接口.虽然你可以用自己的方式实现它,但在module-zero项目中已经完全实现. IAbpSession已…
返回总目录 本篇目录 介绍 ICacheManager ICache ITypedCache 配置 介绍 ABP提供了缓存的抽象,它内部使用了这个缓存抽象.虽然默认的实现使用了MemoryCache,但是也可以为其他的缓存提供者进行实现和改变. ICacheManager 缓存的主要接口是ICacheManager.我们可以注入该接口,然后使用该接口获得一个缓存对象.例如: public class TestAppService : ApplicationService { private re…
返回总目录 本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net,NLog,Serilog等等.Castle为所有的日志类库提供了一个公共的接口.因此,你完全独立于特定的日志记录类库,而且,如果需要的话,你可以轻松地改变应用程序的日志类库. Log4Net是.Net中最流行的日志类库之一.ABP模板中自带了经过合适配置的Log4Net.但是,只存在一行log4n…
返回总目录 本篇目录 介绍 定义设置 获取设置值 更改设置 关于缓存 介绍 每个应用程序都需要存储一些设置信息,然后在应用程序中的某个地方使用这些设置.ABP提供了健壮的基础设施来存储或检索服务端和客户端的应用程序,租户,用户级别的可用设置. 一个设置一般是存储在数据库(或其他源)的name-value字符串对.我们可以将非字符串的值转换成字符串. 关于ISettingStore 为了使用设置系统,必须要实现ISettingStore.虽然你可以用自己的方式实现,但是它已完全实现在module-…
返回总目录 本篇目录 实体类 惯例接口 审计 软删除 激活/未激活 IEntity接口 实体是DDD(领域驱动设计)的核心概念之一.Eirc Evans是这样描述的实体的:"它根本上不是通过属性定义的,而是通过一系列连续性和标识定义的".因此,实体都有Id属性并且都存储到数据库中.一个实体一般会映射到数据库的一张表. 实体类 在ABP中,实体派生自Entity类,看下面的例子: public class Person : Entity { public virtual string N…
返回总目录 本篇目录 IRepository接口 查询 插入 更新 删除 其他 关于异步方法 仓储实现 管理数据库连接 仓储的生命周期 仓储最佳实践 Martin Fowler对仓储的定义 位于领域层和数据映射层之间,使用类似集合的接口来访问领域对象. 在实践中,仓储是执行领域对象(实体和值对象)的数据库操作.一般地,一个分离的仓储用于一个实体(或者聚合根). IRepository接口 在ABP中,一个仓储类应该实现一个IRepository接口.为每一个仓储定义一个接口是一个好的做法. 一个…
返回总目录 本篇目录 介绍 IDomainService接口和DomainService类 样例 创建一个接口 服务实现 调用应用服务 一些讨论 何不只使用应用服务 如何强制使用领域服务 介绍 领域服务(或DDD中的服务)用于执行领域操作和业务规则.Eric Evans描述了一个好的服务应该具备下面三个特征: 和领域概念相关的操作不是一个实体或者值对象的本质部分. 接口定义在领域模型其他元素的条款中. 操作是无状态的. 跟获得或返回一个数据传输对象的应用服务方法(DTO)不同,领域服务获得或者返…
返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRepository.GetAll()方法 UnitOfWork特性的限制 选项 方法 事件 公共连接和事务管理方法 在使用了数据库的应用中,连接和事务管理是最重要的概念之一.何时打开一个连接,何时开始一个事务,如何释放连接等等. 你可能已经知道,Net使用了连接池.因此,创建一个连接实际上是从连接池中…
返回总目录 本篇目录 事件总线 定义事件 触发事件 处理事件 句柄注册 取消注册 在C#中,我们可以在一个类中定义自己的事件,而其他的类可以注册该事件,当某些事情发生时,可以通知到该类.这对于桌面应用或者独立的windows服务来说是非常有用的.但对于一个web应用来说是有点问题的,因为对象都是在web请求中创建的,而且这些对象生命周期都很短,因而注册某些类的事件是很困难的.此外,注册其他类的事件会使得类紧耦合. 领域事件用于解耦并重复利用应用中的逻辑. 事件总线 事件总线是被所有触发并处理事件…
返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除的".这样,如果一个实体是软删除的,那么它不应该在应用中检索到.为了实现这个目的,我们应该在每一个select实体查询操作中添加一个SQL where条件,如"IsDeleted=false".这是乏味但是很重要的一项容易忘记的任务.因此,这项工作应该自动完成. ABP提供了数据…
返回总目录 本篇目录 IApplicationService接口 ApplicationService类 工作单元 数据库连接和事务管理 自动保存更改 更多 应用服务的生命周期 应用服务用于将领域逻辑暴露给展现层.展现层调用具有DTO参数的应用服务,使用领域对象来执行一些特定的业务逻辑并返回给展现层一个DTO.这样,展现层就完全独立于领域层了.在一个理想的分层应用中,展现层永远不直接和领域对象打交道. IApplicationService接口 在ABP中,应用服务应该实现 IApplicati…
返回总目录 本篇目录 验证介绍 使用数据注解 自定义验证 标准化 验证介绍 首先应该验证应用的输入.用户或者其它应用都可以向该应用发送输入.在一个web应用中,验证通常要实现两次:在客户端和服务器端.客户端的验证大多数情况下是为用户体验而实现的.在客户端最好先检查一下表单,并向用户展示不合法的字段.但是服务端的验证更关键且不可避免. 服务端的验证通常实现在应用服务层.应用服务方法应首先检查(验证)输入然后再使用它.ABP提供了一个很好的基础设施来验证应用服务方法的输入. 应用服务方法接收一个DT…
返回总目录 本篇目录 介绍 定义权限 检查权限 使用AbpAuthorize特性 使用IPermissionChecker Razor视图 客户端(Javascript) 权限管理者 介绍 几乎所有的企业应用都在不同程度使用了授权.授权的目的在于检查是否允许用户在应用程序中执行特定的操作.ABP定义了一个基于权限的基础设施来实现授权. 关于IPermissionChecker 授权系统使用了IPermissionChecker来检查权限.虽然你可以用自己的方式实现该接口,但是它已完全实现在了 m…
返回总目录 本篇目录 介绍 功能类型 定义功能 检查功能 功能管理者 版本说明 介绍 大多数的Saas(多租户)应用都有不同 功能的 版本(包).因此,他们可以给租户(客户)提供不同的 价格和功能选项. ABP提供了功能系统使得这个更简单.我们可以 定义功能,然后检查某个功能是否对一个租户 开启了,最后将功能系统 集成到其他的ABP概念中(如权限和菜单). 关于IFeatureValueStore 功能系统使用了IFeatureValueStore来获得功能的值.虽然你可以用自己的方式实现该接口…
返回总目录 本篇目录 介绍 配置 通过特性开启/关闭 注意 我项目中的例子 介绍 维基百科说: "审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作,步骤或其他". ABP提供了一个基础设施,它可以自动记录所有和应用程序交互的日志.它可以记录具有调用者信息和参数的方法调用. 一般地,要保存的字段是:相关的租户Id,调用者的用户Id,调用的 服务名称(调用方法的类名),调用的方法名 , 执…
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器.你可以像以往创建Asp.Net Web API控制器那样创建Web API控制器.依赖注入对于有规律的ApiController(其实就是继承自AbpApiController的控制器)是有效的. 但是你应该从AbpApiController派生控制器,它提供了许多有用的东西,并且更好地集成到了A…
返回总目录 本篇目录 介绍 安装 创建控制器 例子 样例项目 介绍 OData在其官网的定义是: 允许以一种 简单且标准的方式创建和使用可查询的.可互操作的RESTful APIs. 在ABP中也可以使用OData.Abp.Web.Api.OData nuget包简化了它的使用. 安装 安装Nuget包 我们应该首先将Abp.Web.Api.OData nuget包安装到WebApi项目中: Install-Package Abp.Web.Api.OData 设置模块依赖 给我们的WebApi项…