C#接口设计
基本架构
model 实体
说得通俗一些,model中主要是定义前端传过来的变量以及其类型,或者是需要操作的数据库中的某些字段值。举个例子:
namespace Test.Models.Book
{
public class BookModel
{
public int BookId { get; set; }
public string BookName { get; set; }
public DateTime CreateDate { get; set; }
}
}
其中,上面的namespace是申明一个命名空间,Test表示解决方案,Models是实体文件夹,Book表示实体是Book。申明的每个变量都需要有它的类别以及get和set方法。
controller 控制器层
controller文件中主要定义路由的配置信息,请求方法等。举个例子:
using Test.BLL.Book;
using Test.Models.Book;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace Test.Controllers.Book
{
[Route("api/book/[controller]/[action]")]
[ApiController]
public class Book : Controller
{
// 获取书
[HttpGet]
public async Task<ActionResult> GetBookDetail(int BookId)
{
var res = await bookBll.GetBookDetail(BookId);
return Ok(res)
}
// 添加书
[HttpPost]
public async Task<ActionResult> AddBook([FromBody] BookModel model)
{
var res = await bookBll.AddBook(model);
return Ok(res)
}
}
}
bll 业务逻辑层
bll文件中主要处理各种逻辑。
using Test.DAL.Book;
using Test.Models.Book;
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
namespace Test.BLL.Book
{
public class Book
{
BookDal bookDal = new BookDal();
public async Task<dynamic> GetBookDetail(int BookId)
{
return await bookDal.GetBookDetail(BookId);
}
public async Task AddBook(BookModel model)
{
string BookName = model.BookName;
return await bookDal.AddBook(BookName);
}
}
}
dal 数据操作层
dal文件主要用于数据库的操作。
using Test.BLL;
using Test.Models.Book;
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
namespace Test.DAL.Book
{
public class Book
{
public async Task<dynamic> GetBookDetail(int BookId)
{
IDbConnection conn = SqlUtil.SqlConnection(ConfigUtil.GetSysSettings().Book);
string sql = @"SELECT * FROM book WHERE bookId = @bookId"
await SqlUtil.QueryAsync<dynamic>(sql, new { bookName }, connection: conn);
}
public async Task AddBook(string BookName)
{
IDbConnection conn = SqlUtil.SqlConnection(ConfigUtil.GetSysSettings().Book);
string sql = @"INSERT INTO book(bookId,bookName,createDate) values(@bookId,@bookName,GETDATE())"
await SqlUtil.ExecuteAsync(sql, new { bookName }, connection: conn);
}
}
}
前端调用方式
src下的service文件夹的book.js
export async function getBookDetail(params) {
return request(`${SERVICE_BASE}/api/Book/GetBookDetail`, {
method: 'GET',
params
});
}
export async function addBook(params) {
return request(`${SERVICE_BASE}/api/Book/AddBook`, {
method: 'POST',
body: params
});
}
import React, { useEffect } from 'react';
import * as service from '@/services/book';
function book(){
useEffect(() => {
service.getBookDetail({bookId: 1}).then(res=>{
if (res.errorCode == 0) {
console.log(res)
}
})
service.addBook({bookName: "格列夫游记"}).then(res=>{
if (res.errorCode == 0) {
console.log(res)
}
})
})
}
C#接口设计的更多相关文章
- 数据仓储之DLL层接口设计
一.接口设计 1.1. IBaseRepository.cs public interface IBaseRepository<T> { T Add(T entity); bool Upd ...
- RESTful接口设计原则/最佳实践(学习笔记)
RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...
- Web API接口设计经验总结
在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...
- Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)
利用状态机实现比较复杂的接口设计: 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出.这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integra ...
- 优秀的API接口设计原则及方法(转)
一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...
- atitit.基于http json api 接口设计 最佳实践 总结o7
atitit.基于http json api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...
- App接口设计
关于APP接口设计 http://blog.csdn.net/gebitan505/article/details/37924711/
- App接口设计原则-b
1.记住密码不是真的让你记住密码,这里仅仅指的是一种自动登录的手段.不管在任何地方,明文存储的密码都是安全隐患,是必须尽量避免的.你可以采用某种方式对用户名.密码以及时间戳(重要)进行签名,再次登录时 ...
- 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...
随机推荐
- 计算机的主存储器(RAM)
主存储器是存放指令和数据的,并能由 CPU 直接随机存取的存储器.主要由存储体.控制线路.地址寄存器.数据寄存器和地址译码电路五部分组成.
- 刷题记录:Codeforces Round #719 (Div. 3)
Codeforces Round #719 (Div. 3) 20210703.网址:https://codeforces.com/contest/1520. 没错,我是个做div3的蒟蒻-- A 大 ...
- OpenJudge 1.5.15 银行利息
15:银行利息 总时间限制: 1000ms 内存限制: 65536kB 描述 农夫约翰在去年赚了一大笔钱!他想要把这些钱用于投资,并对自己能得到多少收益感到好奇.已知投资的复合年利率为R(0到20之间 ...
- KFS replicator安装(Mysql-KES)
源端mysql 一.安装前置配置 1.创建安装用户 groupadd flysync useradd flysync -g flysync -G mysql passwd flysync 2.上传安装 ...
- dp-位移模型(数字三角形演变)
由数字三角形问题演变而来下面的题: https://www.cnblogs.com/sxq-study/p/12303589.html 一:规定位移方向 题目: Hello Kitty想摘点花生送给她 ...
- Flink SQL 子图复用逻辑分析
子图复用优化是为了找到SQL执行计划中重复的节点,将其复用,避免这部分重复计算的逻辑.先回顾SQL执行的主要流程 parser -> validate -> logical optimiz ...
- js 对象的深复制 解决不能复制undefined (递归)
用普通的拷贝 JSON.parse和 JSON.stringify 进行对象拷贝是不会拷贝undefined //普通的拷贝 const obj = { a: { ...
- Elasticsearch: Join数据类型
在Elasticsearch中,Join可以让我们创建parent/child关系.Elasticsearch不是一个RDMS.通常join数据类型尽量不要使用,除非不得已.那么Elasticsear ...
- ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...
- CentOS7下的lvm(逻辑卷)在线扩容
扩展前该lvm分区为14GB 关闭系统,给sdb硬盘扩展6GB,然后重新进入CentOS.(或者是原有磁盘还有剩余未使用的空间) 对sdb进行分区: [root@converter ~]# fdisk ...