abp

使用ABP框架踩过的坑系列4

匿名 (未验证) 提交于 2019-12-02 22:10:10
数据库连接和事务管理,是数据库应用中的最重要概念之一。做过的人,都会头疼:何时Open一个连接?何时Start一个事务?何时Dispose这个连接?... ABP框架试图用一个叫做UnitOfWork的模型来解决这些。实际开发中,引入UnitOfWork,同时也会带来一些坑。 [ UnitOfWork ] public void SaveFoodMaterials ( FoodMaterialItem food , FoodMaterialCategory cat ) { FoodMaterial fm = Mapper . Map < FoodMaterial >( food ); fm . FoodMaterialCategory = GetCategory ( cat . Name ); ; fm = FoodMaterialRepository . Insert ( fm ); foreach ( var t in food . Nutritions ) { ImportNutrition ( fm , t ); } } 这个会抛Exception: DBContext已经dispose了! [UnitOfWork]没起作用,拦截器没起作用?其实UnitOfWork还有三种使用方式:过程式、惯例、声明式 过程式 using ( var unitOfWork =

ABP框架 - 介绍

匿名 (未验证) 提交于 2019-12-02 22:10:10
在14,15年间带领几个不同的团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用程序架构基础性的功能却是大同小异,例如认证、授权、请求验证、异常处理、DTO、日志、审计、定时任务、调度、多语言、应用配置管理等等这些功能。但是由于项目受限于进度、资源、团队成员的背景,在当时却难于做到各个项目的统一,只能用拷贝的方式,然后在不通的项目中各自再根据各自的需求去做改进。这促使我下定决心去整理实现一个通用的应用程序级别的框架,来提升项目交付的效率和质量。 在整理这个框架的过程中,参考了一些开源框架的设计和实现,无意中发现了ABP(ASP.NET Boilerplate)已经实现的正是我想要的,本着不重复造轮子的原则,在对ABP做了POC和评估后,在向整个评审小组展示时,尽管有诸多细节大家意见不尽相同,但对于整体框架却是少有的一致好评,在后来的项目交付中使用ABP也就是顺利成章的事了。当时ABP的版本还是0.5(现在的最新版本是3.5),尽管也踩了一些坑,但是总的来说还是大幅的提高了项目交付效率。 好了,废话不多说,我们进入正题。 ABP(ASP.NET Boilerplate)是一个开源的应用程序框架,以帮助开发人员快速开发。但它又不仅仅是一个框架,更提供了一套基于DDD的架构模型和最佳实践。 下面我们来研究一个最简单的示例来看看使用ABP好哪些好处 public

[Abp vNext 源码分析] - 9. 接口参数的验证

匿名 (未验证) 提交于 2019-12-02 22:10:10
ABP vNext 针对接口参数的校验工作,分别由过滤器和拦截器两步完成。过滤器内部使用的 ASP.NET Core MVC 所提供的 IModelStateValidator 进行处理,而拦截器使用的是 ABP vNext 自己提供的一套 IObjectValidator 进行校验工作。 关于参数验证相关的代码,分布在以下三个项目当中: Volo.Abp.AspNetCore.Mvc Volo.Abp.Validation Volo.Abp.FluentValidation 通过 MVC 的过滤器和 ABP vNext 提供的拦截器,我们能够快速地对接口的参数、对象的属性进行统一的验证处理,而不会将这些代码扩散到业务层当中。 文章信息: 基于的 ABP vNext 版本:1.0.0 创作日期:2019 年 10 月 22 日晚 更新日期:暂无 模型验证过滤器是直接使用的 MVC 那一套模型验证机制,基于数据注解的方式进行校验。数据注解也就是存放在 System.ComponentModel.DataAnnotations 命名空间下面的一堆特性定义,例如我们经常在 DTO 上面使用的 [Required] 、 [StringLength] 特性等,如果想知道更多的数据注解用法,可以前往 MSDN 进行学习。 模型验证过滤器 ( AbpValidationActionFilter

ABP .Net Core To Json序列化配置

匿名 (未验证) 提交于 2019-12-02 22:10:10
我们采用ABP架构用MVC Controller或Web API返回给前端结果ToJson序列化后得到的属性命名都是采用js的驼峰格式,即首字母小写,后面单词首字母大写的格式(如:后台属性名为OrderName,返回的前端js为orderName)。但在实际项目开发中由于某种原因(比如给老系统提供接口或现有系统集成等)需要采用给后台属性名一致或自己特定的格式,下面就介绍一下基于ABP架构ToJson如何修改默认配置和自定义配置。 在Startup文件进行默认配置修改,代码如下: public class Startup { private readonly IConfigurationRoot _appConfiguration; public Startup(IHostingEnvironment env) { _appConfiguration = env.GetAppConfiguration(); } public IServiceProvider ConfigureServices(IServiceCollection services) { // MVC services.AddMvc()       .AddJsonOptions(options => { //配置tojson格式配置 DefaultContractResolver 为和后台属性名保持一致(即

abp(net core)+easyui+efcore实现仓储管理系统――使用 WEBAPI实现CURD (十五)

匿名 (未验证) 提交于 2019-12-02 22:09:29
abp(net core)+easyui+efcore实现仓储管理系统――领域层创建实体(三) abp(net core)+easyui+efcore实现仓储管理系统――定义仓储并实现 (四) abp(net core)+easyui+efcore实现仓储管理系统――创建应用服务(五) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之控制器(六) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之列表视图(七) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之增删改视图(八) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之菜单与测试(九) abp(net core)+easyui+efcore实现仓储管理系统――多语言(十) abp(net core)+easyui+efcore实现仓储管理系统――使用 WEBAPI实现CURD (十一) abp(net core)+easyui+efcore实现仓储管理系统――使用 WEBAPI实现CURD (十二) abp(net core)+easyui+efcore实现仓储管理系统――使用 WEBAPI实现CURD (十三) abp(net core)

Abp小知识-如何全局设置DontWrapResult属性

匿名 (未验证) 提交于 2019-12-02 22:06:11
GitHub相关demo地址: 对demo说明一下,非abp官网模板,使用Visual Studio 2019创建的 asp.net core 2.2 webapi 项目,引入Abp.AspNetCore包,简单改造一下。 简单列举改造步骤: 初始化项目 通过nuget引入Abp.AspNetCore 创建module 改造Startup Controller需继承AbpController 按照上述步骤改造完成之后,运行站点,返回结果如下(已对返回的json字符串格式化以方便查看) { "result": [ "value1", "value2" ], "targetUrl": null, "success": true, "error": null, "unAuthorizedRequest": false, "__abp": true } 使用属性WrapResult和DontWrapResult控制是否对Controller或者Action处理。默认情况下,会对返回结果封装,封装结果如上。 [DontWrapResult] 等同于 [WrapResult(WrapOnSuccess = false, WrapOnError = false)] 。 对我来说,我是不希望获取干净的返回,不需要什么封装。这时我可以再Controller和Action上添加

abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之菜单与测试(九)

匿名 (未验证) 提交于 2019-12-02 22:06:11
abp(net core)+easyui+efcore实现仓储管理系统――领域层创建实体(三) abp(net core)+easyui+efcore实现仓储管理系统――定义仓储并实现 (四) abp(net core)+easyui+efcore实现仓储管理系统――创建应用服务(五) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之控制器(六) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之列表视图(七) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之增删改视图(八) abp(net core)+easyui+efcore实现仓储管理系统――展现层实现增删改查之增删改视图(八) ), 在这一篇文章 中我们创建一个菜单,并通过这个菜单调用我们之前写的增删除改查的功能。 六、添加菜单 在通过前面的三篇文章学习之后,我们已经创建了视图与控制器,在本文中我们来学习一个菜单,并进行增删改查的测试。 1. 在Visual Studio 2017的“解决方案资源管理器”中,打开单击在展现层“ABP.TPLMS.Web.Mvc”项目中的Startup目录。 找到TPLMSNavigationProvider.cs文件。如下图。 2. 在Visual

Abp vNext计划在今年6月发布.

匿名 (未验证) 提交于 2019-12-02 22:06:11
但可能被标记为Beta版本, 因为.Net Core 3.0将带来很多重大变化. Abp团队希望基于.Net Core 3.0推出1.0的稳定版本. .NET Core 3.0 RC版定于2019年7月发布 GA版定于2019年9月发布 综上所述Abp vNext将于今年7-9月份发布稳定的1.0版本. Abp中文网: https://cn.abp.io/ Abp中文网微信公众号: 文章来源: Abp vNext计划在今年6月发布.

Abp.Castle.Log4Net : Method &#039;get_IsTraceEnabled&#039; does not have an implementation

匿名 (未验证) 提交于 2019-12-02 22:06:11
System.TypeLoadException HResult=0x80131522 Message=Method 'get_IsTraceEnabled' in type 'Abp.Castle.Logging.Log4Net.Log4NetLogger' from assembly 'Abp.Castle.Log4Net, Version=4.5.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation. Source=Abp.Castle.Log4Net StackTrace: at Abp.Castle.Logging.Log4Net.Log4NetLoggerFactory.Create(String name) at Castle.Facilities.Logging.LoggingFacility.RegisterDefaultILogger(ILoggerFactory factory) at Castle.Facilities.Logging.LoggingFacility.Init() at Castle.MicroKernel.DefaultKernel.AddFacility(String key, IFacility facility) at Castle

Abp添加菜单

匿名 (未验证) 提交于 2019-12-02 22:06:11
Abp添加菜单 在abp模板中添加菜单,EntityFramework+Angular.js模板,使用的Abp版本为3.8.1。 创建Abp项目模板,例如名称叫做LawAndRegulation。 服务端添加菜单项 找到Mpa或者Spa项目,也就是LawAndRegulation.WebMpa或者LawAndRegulation.WebSpaAngular。 项目中找到LawAndRegulationNavigationProvider类,在类中找到SetNavigation方法,按照模板中提供的菜单添加方法添加MenuItemDefinition。 MenuItemDefinition即为我们需要添加的菜单项,菜单项包含几个重要的属性: 【name】,菜单项名称,在View层添加菜单项时对应的名称; 【displayName】,显示名称,本地化显示在名称,也就是多语言需要解释的名称; 【url】,导航的路由名称; 【icon】,图标名称; 【requireAuthentication】,登陆认证及权限认证; 设置好这几项后在服务端导航的内容已经设置完成。 示例代码: public class LawAndRegulationNavigationProvider : NavigationProvider { public override void SetNavigation