从零开始搭建ABP框架(Asp .Net Boilerplate)+Oracle(11 g)

一、总体框架介绍

注意:VS2019版本必须在16.9.4以上,并且安装了.NET 5 SDK和运行时!!

事前准备:先前往:https://aspnetboilerplate.com/Templates 生成项目解决方案模板,注意生成时不要勾选Include login, register, user, role and tenant management pages.复选框,,Target Version要选择v5.x,TargetFramework默认.NET5(Cross Platform),输入项目名字和验证码点击生成并下载。

1、公司名/作者名字.项目名.Core 层

目录构成:
公司名/作者名字.项目名.Core
├─ 项目名Consts.cs ---Abp默认生成,Abp项目常量类,主要存放常用的常量,如数据库连接字符串名
├─ 项目名CoreModule.cs  ---Abp模块类,主要管理Core层的初始化工作
├─ Configuration  ---Abp配置
│    └─ AppConfigurations.cs
├─ Localization
│    ├─ 项目名LocalizationConfigurer.cs
│    └─ SourceFiles
│           ├─ 项目名-tr.json
│           └─ 项目名.json
├─ 公司名/作者名字.项目名.Core.csproj
├─ Properties
│    └─ AssemblyInfo.cs
├─ Web
│    └─ WebContentFolderHelper.cs
需引用的Nuget包:
Abp(v6.3.0) Abp.AutoMapper(v6.3.0) Microsoft.Extensions.Configuration.EnvironmentVariables(v5.0.0)

2、公司名/作者名.项目名.Application 层

目录构成:
公司名/作者名.项目名.Application
├─ 项目名AppServiceBase.cs
├─ 项目名ApplicationModule.cs
├─ 公司名/作者名.项目名.Application.csproj
├─ Properties
│    └─ AssemblyInfo.cs
需引用的Nuget包:
Abp.AutoMapper(v6.3.0) Abp.EntityFrameworkCore(v6.3.0)

3、公司名/作者名.项目名.EntityFrameworkCore 层

目录结构:
公司名/作者名.项目名.EntityFrameworkCore
├─ EntityFrameworkCore
│    ├─ 项目名DbContext.cs
│    ├─ 项目名DbContextFactory.cs
│    ├─ 项目名EntityFrameworkCoreModule.cs
│    └─ DbContextOptionsConfigurer.cs
├─ 公司名/作者名.项目名.EntityFrameworkCore.csproj
├─ Properties
│    └─ AssemblyInfo.cs
需引用的Nuget包:
Abp.EntityFrameworkCore(v6.3.0) Oracle.EntityFrameworkCore(v5.21.1)

4、公司名/作者名.项目名.Web 层

目录结构
公司名/作者名.项目名.Web
├─ .bowerrc
├─ App_Data
│    └─ Logs
│           └─ Logs.txt
├─ Controllers
│    ├─ 项目名ControllerBase.cs
│    ├─ ErrorController.cs
│    ├─ HomeController.cs
│    ├─ LayoutController.cs
├─ 公司名/作者名.项目名.Web.csproj
├─ 公司名/作者名.项目名.Web.csproj.user
├─ Project_Readme.html
├─ Properties
│    └─ launchSettings.json
├─ Startup
│    ├─ 项目名NavigationProvider.cs
│    ├─ 项目名WebModule.cs
│    ├─ PageNames.cs
│    ├─ Program.cs
│    └─ Startup.cs
├─ Utils
│    └─ UrlHelper.cs
├─ Views
│    ├─ 项目名RazorPage.cs
│    ├─ Home
│    │    ├─ About.cshtml
│    │    └─ Index.cshtml
│    ├─ Shared
│    │    ├─ Components
│    │    ├─ Error.cshtml
│    │    └─ _Layout.cshtml
│    ├─ _ViewImports.cshtml
│    └─ _ViewStart.cshtml
├─ app.config
├─ appsettings.json ---数据库连接字符串配置文件
├─ bower.json
├─ bundleconfig.json
├─ compilerconfig.json
├─ compilerconfig.json.defaults
├─ log4net.Production.config
├─ log4net.config
├─ web.config
└─ wwwroot├─ css│    ├─ main.css│    ├─ main.less│    └─ main.min.css├─ js│    └─ views├─ lib│    ├─ abp-web-resources│    ├─ blockUI│    ├─ bootstrap│    ├─ bootstrap-paper│    ├─ famfamfam-flags│    ├─ font-awesome│    ├─ jquery│    ├─ jquery-validation│    ├─ json2│    ├─ moment│    ├─ spin.js│    ├─ sweetalert│    └─ toastr└─ view-resources└─ Views
需要引用的Nuget包:
Abp.AspNetCore(v6.3.0) Abp.Castle.Log4Net(v6.3.0) Castle.Core(v4.4.1) Castle.LoggingFacility.MsLogging(v3.1.0) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore(v5.0.0) Microsoft.EntityFrameworkCore.Analyzers(v5.0.6) Microsoft.EntityFrameworkCore.Tools(v5.0.6) Microsoft.Extensions.Logging(v5.0.0) Microsoft.Extensions.Options.ConfigurationExtensions(v5.0.0) Microsoft.VisualStudio.Web.CodeGeneration.Design(v5.0.2) Oracle.EntityFrameworkCore(v5.21.1) Swashbuckle.AspNetCore(v5.0.0) System.Net.NameResolution(v4.3.0) System.Net.Primitives(v4.3.1)

二、准备工作

1、使用VS2019打开网站生成的解决方案,先移除Tests文件夹,因为不需要!

2、选择项目解决方案,鼠标点击右键,选择“还原Nuget包®”。

3、还原完Nuget包之后,将EntityFrameworkCore层里的Microsoft.EntityFramework.SqlServer、Microsoft.EntityFramework.SqlServer.Design包移除。

4、新增Oracle.EntityFrameworkCore包,具体版本号参照上面的第一部分里第三小节。

5、修改EntityFrameworkCore层里的DbContextOptionsConfigurer.cs,将UseSqlServer改为UseOracle。

6、修改Web层里的appsettings.json,把Default里的数据库连接字符串改成Oracle的(具体字符串格式可以百度)

7、引用包时如遇到版本无法降级等情况,先把对应的包卸载,因为有些包已经包含了对应已有的程序集会产生冲突或降级失败等情况发生。

以上工作完成后,接下来正式开始实现单表的增删查改!

三、教程开始

1、新建实体类,User

1.1、展开Core层,右键Core新建文件夹,我们将它命名为User,示例如图:

1.2、右键User文件夹,选择新建类,并把名字命名为TEST_USER。(类名字最好建议对应数据库里数据表的名字,更利于后期的维护!)

1.3、我们在这里定义三个字段,注意该类要继承Abp框架里封装好的Entity,否则依赖注入仓储时会报错!完整代码如下:

using Abp.AutoMapper;
using Abp.Domain.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//注意:所有实体字段都需要有virtual修饰符
namespace Oracle.AbpProject.User
{/// <summary>/// 用户信息实体类/// </summary>//必须加Table特性,特别是在实体类名字与数据表名字不一致的情况下,告诉Abp当前实体类是指向哪个数据表的[Table("TEST_USER")]public class TEST_USER : Entity  //所有要通过仓储实现CRUD的实体类都必须继承自Entity{
//由于Entity内置了一个Id属性,因此如果数据库存在类似或相同的ID字段就需要加上[Column]特性用来并重新指向数据库里的字段[Column("ID")] public override int Id { get; set; }/// <summary>/// 姓名/// </summary>public virtual string NAME { get; set; }/// <summary>/// 年龄/// </summary>public virtual int AGE { get; set; }}
}

1.4、上面的步骤完成后,要记得前往EntityFrameworkCore层里的DbContext.cs里新增如下代码:

public virtual DbSet<TEST_USER> User { get; set; }

2、新建应用服务类,UserAppService

2.1、展开Application层,并右键该层在弹出的菜单中选择新建文件夹,把新文件夹命名为User。

2.2、在Application层的User文件里右键新建接口,IUserAppService,并且在里面定义增删查改接口,代码如下:

using Abp.Application.Services;
using Oracle.AbpProject.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Oracle.AbpProject
{//该接口类需要继承自Abp内置的IApplicationService,同时告诉Abp当前的接口类需要实现应用服务//对于需要频繁读取的接口,例如获取列表等建议用Task异步线程方式去请求public interface IUserAppService:IApplicationService{Task AddUser(TEST_USER user);Task<List<TEST_USER>> UserList();Task DelUser(TEST_USER user);Task UpdUser(TEST_USER user);}
}

2.3、在新建一个接口实现类,UserAppService,并且继承AbpProjectAppServiceBase和IUserAppService,实现刚才定义的增删查改接口,代码如下:

namespace Oracle.AbpProject
{//AbpProjectAppServiceBase,从这个文件不难看出这个文件是Abp默认帮我们当前项目生成的一个应用服务基础类,同时也是实现本地化的一部分,它派生自AppService,而跳转到它的实现,我们会发现它继承了IAppService,所以重要的一部分public class UserAppService: AbpProjectAppServiceBase,IUserAppService{private readonly IRepository<TEST_USER> userRepository;public UserAppService(IRepository<TEST_USER> userRepository){this.userRepository = userRepository;}public async Task AddUser(TEST_USER user){//业务逻辑}public async Task<List<TEST_USER>> UserList(){//业务逻辑}public async Task DelUser(TEST_USER user){//业务逻辑}public async Task UpdUser(TEST_USER user){//业务逻辑}}

3、新建API接口,UserController

3.1、展开Web层里的Controllers文件夹,右键新建控制器,选择WebAPI控制器,操作如图:

3.2、新建完成后,双击打开UserController.cs文件,并写入如下代码:

namespace Oracle.AbpProject.Web.Controllers
{//因为Abp的.NET5版本是基于MVC而不是API的,因此需要手动去声明当前API的路由,否则Swagger无法查找[Route("api/[controller]/[Action]")] [ApiController] //声明告诉Swagger,当前控制器是以API形式展现调用的//所有新建的Controller都需要继承自Abp的ControllerBase,这既是约定规范也是为了让Abp实现统一管理所有接口//AbpProjectControllerBase派生自AbpController,一个Abp内置的Controller函数,同时也基于原生Controllerpublic class UserController : AbpProjectControllerBase{//必须要加ReadOnly,否则会报错,因为Abp默认开启了依赖注入private readonly IUserAppService userAppService;public UserController(IUserAppService userAppService){this.userAppService = userAppService;}[HttpPost]public Task AddUser([FromBody]TEST_USER user){return this.userAppService.AddUser(user);}[HttpGet]public Task<List<TEST_USER>> UserList(){return this.userAppService.UserList();}[HttpDelete]public Task DelUser([FromBody] TEST_USER user){return this.userAppService.DelUser(user);}[HttpPost]public Task UpdUser([FromBody]TEST_USER user) {return this.userAppService.UpdUser(user);}}

四、集成SwaggerUI文档教程

1、引入Nuget包,如按照上面第一节已引用包则可忽略当前步骤:

2、设置并初始化Swagger文档。

2.1、展开Web层找到Starup文件夹里的Starup.cs文件,在ConfigureServices方法体里加入如下代码:

using Microsoft.OpenApi.Models;// 添加Swagger
services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new OpenApiInfo { Title = "Oracle.MyAbpProject Demo", Version = "v1" });
});
services.AddControllers();

注意:由于Abp默认给所有接口开启了JWT验证,因此在没有Token的前提下请求是会报错的,因此我们暂时注释掉如下代码:

options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

2.2、在Configure方法体里加入如下代码:

// 添加Swagger有关中间件
app.UseSwagger();
app.UseSwaggerUI(c =>
{c.SwaggerEndpoint("/swagger/v1/swagger.json", "Oracle.MyAbpProject Demo v1");
});

为防止调试报错时更直观地显示错误提示,我们可以在WebModule中的PreInitialize方法体中加入如下代码:

Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;

注意:Oracle数据库运行的数据事务隔离级别为ReadCommitted,详细原因可以点击链接查看。因此我们需要加上如下代码:

Configuration.UnitOfWork.IsolationLevel = IsolationLevel.ReadCommitted;
Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30);

2.3、预览效果展示:

lize方法体中加入如下代码:

Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;

注意:Oracle数据库运行的数据事务隔离级别为ReadCommitted,详细原因可以点击链接查看。因此我们需要加上如下代码:

Configuration.UnitOfWork.IsolationLevel = IsolationLevel.ReadCommitted;
Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30);

2.3、预览效果展示:

五、知识扩展

为了提升调试开发效率,我们还可以把项目的启动默认页改成Swagger文档主页,具体方法如下:

展开Web层的Properties文件夹,双击打开里面的launchSettings.json文件,并在profiles节点里,完整代码如下:

"profiles": {"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"launchUrl": "swagger/index.html",   //加上这句"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}

从零开始搭建ABP框架(Asp .Net Boilerplate)+Oracle(11 g)相关推荐

  1. 从零开始搭建ABP框架(Asp .Net Boilerplate)+MySQL(v8.0.22)

    从零开始搭建ABP框架(Asp .Net Boilerplate)+MySQL(v 8.0.22) 一.总体框架介绍(传统的WebAPI) 一.总体框架介绍 注意:VS2019版本必须在16.9.4以 ...

  2. 从零开始搭建Android框架系列

    原文链接:http://www.jianshu.com/nb/3767449 开篇介绍和工程目录结构[从零开始搭建android框架系列(1)] 不容错过,最全的安卓架构合集[从零开始搭建androi ...

  3. 从零开始搭建springboot框架

    大家好,我是杨叔.每天进步一点点,关注我的微信公众号[程序员杨叔],获取更多测试开发技术知识!今天分享的内容是:从零开始搭建springboot框架 一.为什么要学习springboot? Sprin ...

  4. qt 从零开始搭建插件框架

    系统设计 搭建插件框架的好处 略 分析 至少分为以下几个模块 需要至少一个界面插件,用于展示界面 需要一些功能插件,为界面提供所需功能,例如FTP功能,网络服务,数据库等等 需要一个插件用于管理其他插 ...

  5. ssm框架搭建连接mysql_从零开始搭建SSM框架(Spring + Spring MVC + Mybatis)

    最近在回顾和总结一些技术,想到了把之前比较火的 SSM 框架重新搭建出来,作为一个小结,同时也希望本文章写出来能对大家有一些帮助和启发,因本人水平有限,难免可能会有一些不对之处,欢迎各位大神拍砖指教, ...

  6. ABP Module-Zero ASP.NET Boilerplate新手问题

    2019独角兽企业重金招聘Python工程师标准>>> 我下的是Module-Zero 4.6 前端错误信息不显示 .net的错误信息要改成<customErrors mode ...

  7. 【一步一个脚印】从零开始搭建SSM框架-- 1.1 配置JDK

    计算机中配置JDK..IDEA中配置JDK 一.计算机中配置JDK JDK官网链接: http://www.oracle.com/technetwork/java/javase/downloads/i ...

  8. 从零开始搭建uni-app框架的小程序开发环境

  9. oracle ping 超时_tnsping无法ping通的问题,TNS-12535 TNS操作超时 (服务器环境:window server 2008R2 数据库环境:oracle 11 g)...

    今天新搭建一个测试用的数据库服务器,操作系统为WIN server 2008 r2 版本.系统内已安装oracle 11g database,数据库服务端已配置完毕,监听listener已开启. 我在 ...

  10. oracle ping 超时_tnsping无法ping通的问题,TNS12535 TNS操作超时 (服务器环境:window server 2008R2 数据库环境:oracle 11 g)...

    今天新搭建一个测试用的数据库服务器,操作系统为WIN server 2008 r2 版本.系统内已安装oracle 11g database,数据库服务端已配置完毕,监听listener已开启. 我在 ...

最新文章

  1. 屏幕录像 Camstudio
  2. War-Driving(战争驾驶***)
  3. java执行多次post请求_同样的post请求代码在Java和android中执行结果不同。
  4. python二维列表切片,python – 切片多维列表
  5. mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】...
  6. 基本可编程芯片初始化字8255、8253、8259
  7. 在eclipse4.5.1官方英文版利用官方语言包汉化的方法
  8. “一云多Region”究竟能为企业解决什么问题?
  9. 6502精品仿真软件(联锁)
  10. Playful MySQL 2: Transactions and some of its potential problems
  11. linux如何停止命令运行,linux的停止命令
  12. Hadoop之block副本放置策略 Rack机架感知源码
  13. 震惊,java8 Nashorn和laytpl居然能擦出这样火花!
  14. 电脑只能上qq不能打开网页
  15. dts无损音乐什么意思_QQ音乐,网易云,AppleMusic谁的音质好?
  16. PostgreSQL年龄的处理
  17. 我们都是被宫崎骏爱过的孩子
  18. rpcx服务框架浅析9-序列化
  19. 【JavaSE系列】基础经典编程题
  20. 大数据Hadoop、Hive、Kafka、Hbase、Spark等框架面经

热门文章

  1. 12面魔方公式图解法_高手指教一下十二面魔方怎么拼?!十二面魔方公式新手图解...
  2. 2017界面UI设计风格流行什么?(一)
  3. 海量图片存储与运算架构
  4. 计算机网络-----网络编程
  5. 高拍仪二次开发(多浏览器,BS,Web)样例
  6. Lua代码加密 LuaJit代码加密
  7. 四级英语测试软件,英语四级必备软件推荐
  8. 【操作指导】安捷伦数据采集器开机自检/通讯接口设置说明
  9. 使用JAVA文件上传的几种方式
  10. 北大软微计算机技术硕士复试,【高分学长带你飞】北大软微408学长超详经验贴...