首页 > 其他分享 >泛型仓储+服务架构落地

泛型仓储+服务架构落地

时间:2023-12-26 14:56:34浏览次数:24  
标签:Task 架构 class 仓储 泛型 Query public

一、前言

本文章只为作学习记录使用,文中图片或引用均为网上摘抄,如涉嫌侵权请联系本人删除。

二、准备工作

1.Visual Studio 2022

2.Windows 11、.NET 6 环境

三、什么是仓储

仓储(Repository)模式自2004年首次作为领域驱动模型DDD设计的一部分引入,仓储本质上是提供提供数据的抽象,以便应用程序可以使用具有接口的相似的简单抽象集合。从此集合中CURD是通过一些列直接的方法完成,无需处理连接、命令等问题,使用此种模式可帮助实现松耦合,并保持领域对象的持久性无知。

  • 仓储模式是为了在程序的数据访问层和业务逻辑层之间创建的一个抽象层
  • 仓储模式是一种数据访问模式,提供一种更松散耦合的数据访问方法
  • 将创建数据访问的逻辑写在单独的类中即仓储
  • 仓储负责和业务层进行持久化通信

仓储(Repository)是存在于工作单元和数据库之间单独分离出来的一层,是对数据访问的封装。其优点是

  • 业务层无需知道具体实现达到分离关注点
  • 提高对数据库访问的维护,对于仓储的改变并不改变业务的逻辑。

 

那么什么是泛型仓储呢?

在开发中,我们经常需要与数据库进行交互,进行数据的增删改查操作。这个过程可以通过使用Entity Framework (EF)来简化。EF是一个强大的对象关系映射(ORM)框架,它允许我们以面向对象的方式操作数据库。

在编写数据访问层代码时,我们经常会遇到一些重复的操作,比如增删改查的基本操作。为了提高代码的复用性和减少冗余,我们可以引入泛型仓储模式。

泛型仓储模式是一种常见的设计模式,它将数据访问层的常见操作进行了抽象和封装,通过泛型参数来实现对不同实体类型的操作,实现了代码的复用性和可扩展性。

在EF中,我们可以利用泛型仓储模式来封装常见的CRUD(Create, Read, Update, Delete)操作,使我们的数据访问层更加简洁和高效。

如下代码便实现了一个简单的泛型接口

 public interface IRepository<TEntity,Tvo> where TEntity : class
 {
     Task<List<TEntity>> Query();
 }

仓储实现

public class Repository<TEntity, Tvo> : IRepository<TEntity,Tvo> where TEntity : class,new()
{
    public async Task<List<TEntity>> Query()
    {
        await  Task.CompletedTask; //此处应为数据库查询,本次只做简单演示
        return new List<TEntity>();
    }
}

四、项目结构

Common层:主要是一些底层的工具类,公共方法等等。无引用项目

Host层:项目入口层,引用Sevice层

IService层:业务接口层,引用Model层

Model层:实体类存储,引用Common层

Repository:泛型仓储层,数据库交互,引用Model层

Service层:为业务接口的实现层,引用IService层和Repository层

五、案例代码

1.Model实体

 public class User
 {
     public int Id { get; set; }
     public string Name { get; set; }
 }

2.泛型仓储以及实现

public interface IRepository<TEntity,Tvo> where TEntity : class
{
    Task<List<TEntity>> Query();
}
public class Repository<TEntity, Tvo> : IRepository<TEntity,Tvo> where TEntity : class,new()
{
    public async Task<List<TEntity>> Query()
    {
        await  Task.CompletedTask; //此方法代码应为数据库查询,本次只做简单演示,此行代码是为了 async不进行报错。
        return new List<TEntity>();
    }
}

3.业务接口

public interface IService<TEntity>where TEntity : class
{
    Task<List<TEntity>> Query();
}

4.实现业务接口

public class Service<T,Tvo>: IService.IService<T, Tvo> where T : class,new()
{
    public async Task<List<T>> Query()
    {
        var BaseRepository = new Repository.Repository<T, Tvo>();
        return await BaseRepository.Query();
    }
}

Tvo:后续可能作为数据传输对象使用,此处并未使用。

5.Host 控制器代码

[HttpGet(Name = "GetUserList")]
public async Task<List<User>> Get()
{
 var UserService = new Service.Service<User, UserVo>();//后期使用依赖注入实现,本次只做演示
 return await UserService.Query();
}

六、总结

1.通过使用.NET EF泛型仓储模式,我们可以提高代码的复用性和可维护性。

2.泛型仓储模式将数据访问层的常见操作进行了封装,使我们可以更加专注于业务逻辑的处理,而无需关注底层的数据库操作。

3.当需要创建新的数据访问层时,我们只需要实现。

4.学习并非一日之功,多写多看多练。

标签:Task,架构,class,仓储,泛型,Query,public
From: https://www.cnblogs.com/ykingyds/p/17928116.html

相关文章

  • 吉特日化MES & 日化制药工厂信息化系统架构图
     作者:情缘  吉特仓储管理系统开源地址:https://github.com/hechenqingyuan/gitwms吉特日化MES演示地址:http://mes.gitwms.com/标签:吉特仓储管理系统(开源WMS),吉特日化生产执行制造系统(日化MES),称量防差错系统,投料防差......
  • 分布式架构的高性能与可用性
    分布式架构是一种将系统拆分为多个独立的组件或服务,并在不同的计算节点上部署这些组件或服务的架构方式。它可以提供高性能和可用性的好处。下面我将详细介绍分布式架构在高性能和可用性方面的优势。高性能横向扩展:分布式架构可以通过增加计算节点来实现横向扩展,从而提高系统......
  • Hive的体系架构
      Hello,大家好,上一篇博文聊了一下Hive的基本知识,为了让大家更深入地理解Hive,本篇就写一下Hive的体系架构吧。  先看一张图: 大概解释一下:command-lineshell&thrift/jdbc     可以用command-lineshell和thrift/jdbc两种方式来操作数据:    ......
  • electron 技术架构
    Electron核心组成 核心总结Chromium:支持最新特性的浏览器(支持ES6及其他版本的新语法)Node.js: Javascript运行时,可实现文件读写等(本地命令调用和执行操作)    NativeAPIs:提供统一的原生界面能力(与操作系统通信,如操作系统的通知、快捷键、获取底层硬......
  • 吉特日化MES 与周边系统集成架构
     作者:情缘  出处:http://www.cnblogs.com/qingyuan/关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同......
  • 盘点大部分程序员(架构师)都会走的弯路(有则改之无则加勉)
    文章目录写在前面一、技术第一,业务、情商、沟通去一边吧二、盲目追求大公司的技术解决方案三、追赶时髦技术,对旧技术嗤之以鼻四、“面向PPT编程——纸上谈兵”五、会的多vs会的精?六、学完就忘写在前面很多程序员,其实并不是出身于BAT等大厂,而是在一些中小厂为公司为自己发光发热。......
  • 《架构师之路:软件架构之美》阅读三
    老师教我们软件架构的时候,就告诉我们,软件开发,先从架构入手。他说,弄清楚了架构,再来学习具体的语法和技术就很简单了。以前不懂,底层具体的细节都不了解,如何来构建一个系统呢?就像让我们去建造一栋大厦,刚开始想到的可能就是需要砖、砌墙的工具、、、、、这就像刚学习编程的自己,以为掌......
  • 在arm架构的银河麒麟系统部署Redis
    以下是在arm架构的银河麒麟系统上部署Redis的详细步骤:1.创建文件夹首先,在合适的位置创建必要的文件夹。在本例中,我们将创建/opt/redis和/usr/src/redis两个文件夹。mkdir/opt/redismkdir/usr/src/redis2.准备Redis及其依赖库移动redis-6.2.12.tar.gz到/usr/src/redis......
  • 前端微服务架构1-项目启动及打包部署
    启动父子应用可以单独启动,单独启动就不说了关于一起启动1、安装npmall: npm install npm-run-all --save-dev2、编写启动命令"scripts":{  "dev":"webpack-dev-server--inline--hot--progress--configbuild/webpack.dev.conf.js",  "start":"np......
  • 前端微服务架构1-搭建项目
    公司项目老旧,迭代时间过久,迭代人员水平一般的情况下还有添加新模块怎么办?这几天尝试了一下开源的微服务架构,目前网上有两种开源框架:1、蚂蚁的qiankun目前15.1k2、京东的micro-app目前4.9k点赞,前者的点赞量在github上更高,所以我选择了前者搭建也不是很难,主要是遇到的一些坑的......