面向接口编程实践之aspnetcoreapi的抽象
最为一名越过菜鸟之后的开发,需要做接口开发。下面做一个纯粹的接口编程的实例demo,仅仅是一个webapi接口的抽象。
下面是代码接口,AbsEFWork是webapi,BaseEntityFramework是一个接口库。
先介绍一下webapi的实现,代码是从底层往上层写的,阅读代码的习惯应该是自上向下。
public class ProductController : CustomController<Product>
{
public ProductController(IEFCoreService<Product> efCoreService) : base(efCoreService)
{
}
}
控制器代码很简单的实现了CustomController,数据载体是Product。
using BaseEntityFramework.Implementations;
using BaseEntityFramework.Implementations.Entitys;
using BaseEntityFramework.IService;
using Microsoft.EntityFrameworkCore; namespace BaseEntityFramework
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers();
builder.Services.AddDbContext<ProductDbContext>(options => options.UseInMemoryDatabase("memorydb"));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IEFCoreService<Product>, EFCoreProductService>();
var app = builder.Build(); // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
}
}
}
Program启动程序需要实现IEFCoreService的注入,以及ProductDbContext 的内存实现。
这样就可以启动一个swagger
对于product数据存储的具体实现,实体类product和dbcontext必须要自己去实现它。
public class Product:IEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; } [Column(TypeName = "decimal(28,16)")]
public decimal Price { get; set; }
}
using BaseEntityFramework.Implementations.Entitys;
using Microsoft.EntityFrameworkCore; namespace BaseEntityFramework.Implementations
{
public class ProductDbContext:DbContext
{
public ProductDbContext(DbContextOptions<ProductDbContext> dbContextOptions):base(dbContextOptions)
{ }
public DbSet<Product> Products { get; set; }
}
}
查看上面的控制器代码,有注入IEFCoreService<Product>的业务代码,对于接口肯定是需要一个实现,这里可以再次封装一个抽象的基类来(温馨提示:重复的代码,必须优化),我这里暂时没做处理。
using BaseEntityFramework.Implementations.Entitys;
using BaseEntityFramework.IService;
using BaseEntityFramework.Models;
using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions; namespace BaseEntityFramework.Implementations
{
public class EFCoreProductService : IEFCoreService<Product>
{
private readonly ProductDbContext _dbContext;
public EFCoreProductService(ProductDbContext productDbContext)
{
_dbContext = productDbContext;
} public async Task<bool> Add(Product entity)
{
_dbContext.Products.Add(entity);
var result = await _dbContext.SaveChangesAsync();
return result != 0;
} public Task<bool> Delete(Product entity)
{
throw new NotImplementedException();
} public async Task<IEnumerable<Product>> GetAll()
{
var result =await _dbContext.Products.ToListAsync();
return result;
} public Task<Product> GetEntity(Expression<Func<Product, bool>> expression)
{
throw new NotImplementedException();
} public async Task<IReadOnlyCollection<Product>> GetList(Expression<Func<Product, bool>> expression)
{
var result = await _dbContext.Products.Where(expression).ToListAsync();
return result.AsReadOnly();
} public Task<PageResult<Product>> GetPageResult<Req>(PageInput<Req> pagInput) where Req : new()
{
throw new NotImplementedException();
} public Task<bool> Update(Product entity)
{
throw new NotImplementedException();
}
}
}
上面的代码很简单易懂,最大的好处就是可以复用。实体类和 dbcontext越多这个简简单单的结构就越是有用。
BaseEntityFramework的核心逻辑就是把业务代码做了抽象,做了一个统一的模板,不管 是从那方便说都只有好处。而且作为开发只关心自己的业务代码这一块。
public interface IEFCoreService<T> where T:IEntity
{
Task<bool> Add(T entity) ;
Task<bool> Delete(T entity);
Task<bool> Update(T entity);
Task<IReadOnlyCollection<T>> GetList(Expression<Func<T,bool>> expression) ;
Task<PageResult<T>> GetPageResult<Req>(PageInput<Req> pagInput) where Req:new();
Task<T> GetEntity(Expression<Func<T, bool>> expression);
Task<IEnumerable<T>> GetAll();
}
以上的实例只是一个简单的demo,项目中需要做框架的话这或许是一个开始,需要做的远远不止这些。
源代码:
liuzhixin405/AbsEFWork (github.com)
面向接口编程实践之aspnetcoreapi的抽象的更多相关文章
- Java反射(六)纯面向接口编程的简单框架实践
我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...
- .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)
阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...
- C#面向接口编程详解(1)——思想基础
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...
- 面向接口编程详解-Java篇
相信看到这篇文字的人已经不需要了解什么是接口了,我就不再过多的做介绍了,直接步入正题,接口测试如何编写.那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象.为充分考虑到初学者,所 ...
- 设计与实现分离——面向接口编程(OO博客第三弹)
如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度 ...
- Spring学习(2):面向接口编程思想
一. 引言 Spring核心的IOC的实体用了面向接口编程思想,所以有必要了解下.简单来说的话,Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 接口的定义的概念:泛指实 ...
- C#扫盲篇(二)依赖倒置•控制反转•依赖注入•面向接口编程--满腹经纶的说
扫盲系列的文章收到了广大粉丝朋友的支持,十分感谢,你们的支持就是我最大动力. 我的扫盲系列还会继续输出,本人也是一线码农,有什么问题大家可以一起讨论.也可以私信或者留言您想要了解的知识点,我们一起进步 ...
- 编写Java程序,使用面向接口编程模拟不同动物的吼叫声
返回本章节 返回作业目录 需求说明: 使用面向接口编程模拟不同动物的吼叫声 实现思路: 使用面向接口编程模拟不同动物吼叫声的实现思路: 定义发声接口Voice,在其中定义抽象吼叫方法sing(). 分 ...
- C#进阶系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程)
序:忙碌多事的八月带着些许的倦意早已步入尾声,金秋九月承载着抗战胜利70周年的喜庆扑面而来.没来得及任何准备,似乎也不需要任何准备,因为生活不需要太多将来时.每天忙着上班.加班.白加班,忘了去愤,忘了 ...
- 使用Castle扩展Ibatis.Net,面向接口编程-更优雅的代码
使用Ibatis.Net做项目半年了,甚是喜欢,感觉确实是个简单.轻巧的O/R Mapping框架,特别是将Sql配置在Xml文件中,相当于直接将Dao层抽离了出来. 本文假定读者对Ibatis.Ne ...
随机推荐
- Unity学习笔记——坐标转换(3)
通过Transform.Translate移动物体 6个重载: public void Translate(float x, float y, float z, [De ...
- [Leetcode 235/236]LCA二叉树最近公共祖先Lowest Common Ancestor of a Binary Tree
题目 给定二叉树和两个点,求两点的LCA最近公共祖先 Given a binary tree, find the lowest common ancestor (LCA) of two given n ...
- 【原创】freetype android交叉编译
项目中Opencv需要显示中文,由于本身并不支持,所以需要借助第三方的库freetype来实现.这个库虽然android本身也有使用,但并没有暴露接口给外部使用. freetype官网 方式1 脚本编 ...
- 第四章 快速排序 分而治之(divide an conquer)
def quicksort(array): if len(array) < 2: return array else: flag = array[0] less = [] greater = [ ...
- 2.Vue模板语法
1.模板语法的概述 (1)如何理解前端渲染 将数据填充到HTML标签中,生成静态的HTML内容 2.前端渲染方式 (1)原生JS拼接字符串 (2)使用前端模板引擎 (3)使用Vue特有的模板语法 3. ...
- pod进阶
一.Lifecycle 官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ 通过前面的分享,关于pod是什么相信看 ...
- baodoumi yml配置
上次因为自增,发现配置没生效, 修改后如下 # 配置mybatis-plus, 参考:com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropert ...
- 基于LAMP搭建WordPress博客
1.安装Apache. 1)执行如下命令,安装Apache服务及其扩展包. yum -y install httpd mod_ssl mod_perl mod_auth_mysql 2)执行如下命令, ...
- LightOJ1298 One Theorem, One Year (欧拉函数dp)
题意:给你almost-K-First-P-Prime, 如果一个数x有k个质因子,且这k个质因子包含且仅包含前p个质数满足条件. 让你求Σφ(x): 思路:首先我们这p个因子一定要有,也就是剩下k- ...
- 一篇文章带你了解Java中的运算符
前言 在前一篇文章中,壹哥给大家讲解了Java数据类型之间的转换,包括自动类型转换.强制类型转换.隐含的强制类型转换等问题.且在上一篇文章中,我还简单地给大家提到了Java的类型提升.在类型提升的案例 ...