园子里关于 ASP.NET Core web API 的教程很多, 但大多都是使用 EF+Mysql 或者 EF+MSSQL 的文章. 甚至关于 ASP.NET Core Web API 中使用 Dapper+Mysql 组合的文章都很少, 更别提 Oracel+Dapper 组合的文章了, 那么今天就带着大家一起翻译一篇国外大牛写的关于 ASP.NET Core Web API 开发中使用 Oracle+Dapper 的组合的文章吧.
注: 虽然本文内容是翻译, 但是楼主刚在 2.1 环境是使用成功, 中间也没有任何阻碍, 只是鉴于本人电脑配置太差无法安装 Oracle 数据库, 所以无法进行演示, 再者是表示对原作者的尊重, 所以在这里只是对原作内容进行翻译然后加上自己的理解稍作改动. 应该能对大家使用 Oracle+Dapper 组合开发 ASP.NET Core Web API 有所帮助.
本文的重点是介绍如何使用 Dapper ORM+Oracle 数据库的组合来创建 ASP.NET Core Web API. 首先, 在这里, 我们不使用 SQL , 因为互联网上已有很多文章都是使用 SQL Server 进行演示的. 所以, 我想写一篇使用 Oracle 作为数据库的文章. 为了降低数据库访问逻辑的复杂性, 我们使用 Dapper ORM. 那么, 让我们赶紧开始实战演练吧.
创建一个 ASP.NET Core Web API 项目
如果要创建一个新的 ASP.NET Core Web API 项目的话, 只需要打开 Visual Studio 2017 版本 15.3 及以上, 然后按照以下步骤操作.
打开文件菜单, 点击新建 >> 项目
在新打开的新建项目窗口, 首先你需要选择 .NET Framework 4.6 及以上版本, 然后在左侧面板选择 C# , 然后选择 .NET Core
在右侧面板中选择 ".NET Core Web 应用程序" 并且选择项目位置, 最后点击 "确定"
在下一个窗口, 在众多模板中选择 Web API 模板
写如何新建 ASP.NET Core Web API 的这些步骤的时候我都嫌累, 我想大家应该都知道怎么创建吧! 就不上图片了.
设置 Oracle 表和存储过程
首先要为演示创建数据库以及表, 我们这里使用 Oracle Developer Tools. 因为它非常小巧灵活, 可以帮助我们顺利的处理 Oracle 数据库.
Oracle SQL Developer 是一个免费的集成开发环境, 可简化传统和云部署中 Oracle 数据库的开发和管理. SQL Developer 提供完整的 PL / SQL 应用程序端到端开发, 运行查询和脚本的工作表, 用于管理数据库的 DBA 控制台, 报告界面, 完整的数据建模解决方案以及用于迁移第三方数据到 Oracle 的平台.
创建一个名为 "TEST_DB" 的数据库名称, 并在其中创建一个表名为 "EMPLOYEE". 您可以使用以下语法在 "TEST_DB" 数据库中创建表.
- CREATE TABLE "TEST_DB"."EMPLOYEE"
- ( "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 100 CACHE 20 NOORDER NOCYCLE ,
- "NAME" VARCHAR2(255 BYTE),
- "SALARY" NUMBER(10,0),
- "ADDRESS" VARCHAR2(500 BYTE)
- ) SEGMENT CREATION IMMEDIATE
- PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
- NOCOMPRESS LOGGING
- STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
- PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
- BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
- TABLESPACE "TEST_DATA" ;
我们需要在表中添加一些虚拟数据, 以便我们可以直接从 PostMan 获取数据. 所以, 我们在这里添加四条记录如下.
- Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (100,'Mukesh',20000,'India');
- Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (101,'Rion',28000,'US');
- Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (102,'Mahesh',10000,'India');
- Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (103,'Banky',20000,'India');
现在我们来创建一个存储过程, 用来获取员工记录列表. 这里我们使用 Cursor 返回数据列表作为输出参数.
- CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEES" (
- EMPCURSOR OUT SYS_REFCURSOR
- )
- AS
- Begin
- Open EMPCURSOR For
- SELECT ID, NAME, SALARY,ADDRESS FROM Employee;
- End;
下面我们再创建一个存储过程, 它根据员工 ID 获取员工的个人记录
- CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEEDETAILS"
- (
- EMP_ID IN INT,
- EMP_DETAIL_CURSOR OUT SYS_REFCURSOR
- ) AS
- BEGIN
- OPEN EMP_DETAIL_CURSOR FOR
- SELECT ID, NAME, SALARY,ADDRESS FROM Employee WHERE ID = EMP_ID;
- END;
安装 Dapper ORM
从 "工具" 菜单的 "Nuget 包管理器" 中打开 "包管理器控制台", 然后输入以下命令并按 Enter 键以安装 dapper 及其依赖项 (如果有)
Install-Package Dapper -Version 1.50.5
当然还有另一个安装方式, 具体可以看 [ASP.NET Core WebApi 使用 Swagger 生成 api 说明文档看这篇就够了][http://www.cnblogs.com/yilezhu/p/9241261.html] 中关于安装 Swashbuckle.AspNetCore 的步骤
安装完成后, 你可以查看下项目大的引用中, 是否有 "Dapper" 的引用, 如果有的话表示安装正确
为项目安装 Oracle Manage Data Access
我们在 Asp.Net Core Web API 应用程序中使用 Oracle, 需要从 Core 应用程序访问 Oracle 数据库. 要将 Oracle 数据库与. Net Core 应用程序一起使用, 我们有 Oracle 库, 它将帮助我们管理数据库访问的逻辑. 因此, 我们必须安装以下 bata 的软件包.
Install-Package Oracle.ManagedDataAccess.Core -Version 2.12.0-beta2
添加 Oracle 数据库连接
现在我们已准备好与数据库相关的所有内容, 如数据库, 表和 SP 等. 要从 Web API 访问数据库, 我们必须像往常一样在 "appsettings.json" 文件中创建连接字符串.
- {
- "Logging": {
- "IncludeScopes": false,
- "Debug": {
- "LogLevel": {
- "Default": "Warning"
- }
- },
- "Console": {
- "LogLevel": {
- "Default": "Warning"
- }
- }
- },
- "ConnectionStrings": {
- "EmployeeConnection": "data source=mukesh:1531;password=**********;user id=mukesh;Incr Pool Size=5;Decr Pool Size=2;"
- }
- }
创建一个仓储
为了保持关注点的分离, 我们在这里使用 Repository. 在 Web API 项目中创建一个新文件夹作为 "仓储库", 并创建一个 "IEmployeeRepository" 接口和一个它的实现类 "EmployeeRepository", 它将实现到 IEmployeeRepository.
- namespace Core2API.Repositories
- {
- public interface IEmployeeRepository
- {
- object GetEmployeeList();
- object GetEmployeeDetails(int empId);
- }
- }
以下是实现了 IEmployeeRepository 的 EmployeeRepository 类. 它需要访问配置中的数据库连接串, 因此我们在构造函数中注入 IConfiguration. 所以, 我们已经准备好使用配置对象了. 除此之外, 我们还有 GetConnection() 方法, 该方法将从 appsettings.json 获取连接字符串, 并将其提供给 OracleConnection 以创建连接并最终返回连接. 我们已经实现了 "IEmployeeRepository", 它有两个方法, 如 GetEmployeeDetails 和 GetEmployeeList.
- using Core2API.Oracle;
- using Dapper;
- using Microsoft.Extensions.Configuration;
- using Oracle.ManagedDataAccess.Client;
- using System;
- using System.Data;
- namespace Core2API.Repositories
- {
- public class EmployeeRepository : IEmployeeRepository
- {
- IConfiguration configuration;
- public EmployeeRepository(IConfiguration _configuration)
- {
- configuration = _configuration;
- }
- public object GetEmployeeDetails(int empId)
- {
- object result = null;
- try
- {
- var dyParam = new OracleDynamicParameters();
- dyParam.Add("EMP_ID", OracleDbType.Int32, ParameterDirection.Input, empId);
- dyParam.Add("EMP_DETAIL_CURSOR", OracleDbType.RefCursor, ParameterDirection.Output);
- var conn = this.GetConnection();
- if (conn.State == ConnectionState.Closed)
- {
- conn.Open();
- }
- if (conn.State == ConnectionState.Open)
- {
- var query = "USP_GETEMPLOYEEDETAILS";
- result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);
- }
- }
- catch (Exception ex)
- {
- throw ex;
- }
- return result;
- }
- public object GetEmployeeList()
- {
- object result = null;
- try
- {
- var dyParam = new OracleDynamicParameters();
- dyParam.Add("EMPCURSOR", OracleDbType.RefCursor, ParameterDirection.Output);
- var conn = this.GetConnection();
- if(conn.State == ConnectionState.Closed)
- {
- conn.Open();
- }
- if (conn.State == ConnectionState.Open)
- {
- var query = "USP_GETEMPLOYEES";
- result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);
- }
- }
- catch (Exception ex)
- {
- throw ex;
- }
- return result;
- }
- public IDbConnection GetConnection()
- {
- var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;
- var conn = new OracleConnection(connectionString);
- return conn;
- }
- }
- }
- public IDbConnection GetConnection()
- {
- var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;
- var conn = new OracleConnection(connectionString);
- return conn;
- }
为了在. Net Core 中使用 Oracle 的数据类型, 我们使用的是 OracleDyamicParameters 类, 它将提供管理 Oracle 参数行为的一系列方法.
- using Dapper;
- using Oracle.ManagedDataAccess.Client;
- using System.Collections.Generic;
- using System.Data;
- namespace Core2API.Oracle
- {
- public class OracleDynamicParameters : SqlMapper.IDynamicParameters
- {
- private readonly DynamicParameters dynamicParameters = new DynamicParameters();
- private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();
- public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null)
- {
- OracleParameter oracleParameter;
- if (size.HasValue)
- {
- oracleParameter = new OracleParameter(name, oracleDbType, size.Value, value, direction);
- }
- else
- {
- oracleParameter = new OracleParameter(name, oracleDbType, value, direction);
- }
- oracleParameters.Add(oracleParameter);
- }
- public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction)
- {
- var oracleParameter = new OracleParameter(name, oracleDbType, direction);
- oracleParameters.Add(oracleParameter);
- }
- public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
- {
- ((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity);
- var oracleCommand = command as OracleCommand;
- if (oracleCommand != null)
- {
- oracleCommand.Parameters.AddRange(oracleParameters.ToArray());
- }
- }
- }
- }
在 Startup.cs 中配置依赖
如果要在控制器或仓储类中使用依赖项的话, 我们必须配置或者说在 Startup 类的 ConfigureServices 方法中为我们的接口注册我们的依赖项类. (翻译的好拗口, 楼主四级没过, 希望不被喷)
- using Core2API.Repositories;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.DependencyInjection;
- namespace Core2API
- {
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
- public IConfiguration Configuration { get; }
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddTransient<IEmployeeRepository, EmployeeRepository>();
- services.AddSingleton<IConfiguration>(Configuration);
- services.AddMvc();
- }
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- app.UseMvc();
- }
- }
- }
添加 EmployeeController 控制器
现在是时候在 EmployeeControler 中创建 API 调用了. 首先, 我们在构造函数中添加了 IEmployeeRepository 以使用依赖项. 其次, 我们必须为两个方法创建带有 Route 属性的 API 调用.
- using Core2API.Repositories;
- using Microsoft.AspNetCore.Mvc;
- namespace CoreAPI.Controllers
- {
- [Produces("application/json")]
- public class EmployeeController : Controller
- {
- IEmployeeRepository employeeRepository;
- public EmployeeController(IEmployeeRepository _employeeRepository)
- {
- employeeRepository = _employeeRepository;
- }
- [Route("api/GetEmployeeList")]
- public ActionResult GetEmployeeList()
- {
- var result = employeeRepository.GetEmployeeList();
- if (result == null)
- {
- return NotFound();
- }
- return Ok(result);
- }
- [Route("api/GetEmployeeDetails/{empId}")]
- public ActionResult GetEmployeeDetails(int empId)
- {
- var result = employeeRepository.GetEmployeeDetails(empId);
- if (result == null)
- {
- return NotFound();
- }
- return Ok(result);
- }
- }
- }
现在我们已准备就绪, 就像存储库已准备好, 与 Oracle 数据库的连接已准备就绪, 最后, API 调用也在控制器内部就绪. 因此, 是时候在 PostMan 中运行 API 来查看结果了. 只需按 F5 即可运行 Web API 然后打开 PostMan 进行测试.
要在 PostMan 中进行测试, 首先选择 "Get" 作为方法, 并提供 URL 以获取员工记录列表, 然后单击 "发送" 按钮, 该按钮将向我们的 API 发出请求并使用我们文章开始时创建的数据库脚本来获取我们在此处添加的员工列表数据.
要获取单个员工记录, 只需传递以下 URL, 如图中所示. 您可以在此处看到, 我们希望查看员工 ID 103 的记录. 发送请求后, 您可以看到如下所示的输出.
最后
所以, 今天, 我们已经学会了如何创建 ASP.NET Core Web API 项目并使用 Dapper 与 Oracle 数据库一起使用.
我希望这篇文章能对你有所帮助. 请使用评论来进行反馈, 这有助于我提高自己的下一篇文章. 如果您有任何疑问, 请在评论部分发表你的疑问, 如果您喜欢这篇文章, 请与您的朋友分享. 并记得点下推荐哦!
来源: https://www.cnblogs.com/yilezhu/p/9276565.html