让Dapper在一个项目中支持多种库

如果想在一个项目中,用DapperPlus支持多种数据库该怎么做?

在《让Dapper支持Mock》中我们定义了DapperPlus,可以基于这个类,实现两个子类:MySqlDapperPlus,MsSqlDapperPls,在这两个子类的构造中适配对应的数据库类型,从注放容器中,获取IDbConnection实例,根据实例的类型来选取配置中的对应连接字符串,这里用到的是根据数据类型来配置,也是一种约定。

MySqlDapperPlus.cs

using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;namespace WebDemo01.Services
{public class MySqlDapperPlus : DapperPlus{public MySqlDapperPlus(IEnumerable<IDbConnection> connections, IConfiguration configuration){var connectionStrings = configuration.GetSection("ConnectionStrings").Get<Dictionary<string, string>>();          _connection = connections.FirstOrDefault(c => c.GetType().Name == "MySqlConnection");_connection.ConnectionString = connectionStrings.Where(s => s.Key.ToLower().Contains("mysql")).FirstOrDefault().Value;}}
}

MsSqlDapperPlus.cs

using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;namespace WebDemo01.Services
{public class MsSqlDapperPlus : DapperPlus{public MsSqlDapperPlus(IEnumerable<IDbConnection> connections, IConfiguration configuration){var connectionStrings = configuration.GetSection("ConnectionStrings").Get<Dictionary<string, string>>();          _connection = connections.FirstOrDefault(c => c.GetType().Name == "SqlConnection");_connection.ConnectionString = connectionStrings.Where(s => s.Key.ToLower().Contains("mssql")).FirstOrDefault().Value;}}
}

这时,会有问题,DapperPlus没有无参构造,_connection访问级别也太低,所以要改造一下DapperPlus。

    /// <summary>/// DappePlusr类/// </summary>public class DapperPlus : IDapperPlus{protected IDbConnection _connection;/// <summary>/// 无参构造函数/// </summary>public DapperPlus(){}//下面和原来的一样}
public void ConfigureServices(IServiceCollection services)
{services.AddControllers();services.AddScoped<IDbConnection, MySqlConnection>();services.AddScoped<IDbConnection, SqlConnection>();services.AddScoped<IDapperPlus, MySqlDapperPlus>();services.AddScoped<IDapperPlus, MsSqlDapperPlus>();
}

appsettings.json

  "ConnectionStrings": {"MySqlConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=mysql_testdb","MsSqlConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=mssql_testdb"}

如果是多个库,还要读写分离该怎么实现?其实和不分离是一样的,要改造《让Dapper读写分离》中的DapperPlusWrite和DapperPlusRead两个类,分别增加无参构造函数,和把_connection改成protected,方便子类中参访问到。

然后定义三个类:MySqlDapperPlusRead和MsSqlDapperPlusRead继承DapperPlusRead;MySqlDapperPlusWrite和MsSqlDapperPlusWrite继承DapperPlusWrite。在四个类的构造函数中,按照自己数据库的类型,Read或Write类型来取配置文件中的连接字符串即可。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddControllers();services.AddScoped<IDbConnection, MySqlConnection>();services.AddScoped<IDbConnection, SqlConnection>();services.AddScoped<IDapperPlusRead, MySqlDapperPlusRead>();services.AddScoped<IDapperPlusRead, MsSqlDapperPlusRead>();services.AddScoped<IDapperPlusWrite, MySqlDapperPlusWrite>();services.AddScoped<IDapperPlusWrite, MsSqlDapperPlusWrite>();
}

appsettings.json

  "ConnectionStrings": {"MySqlReadConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=read_mysql_testdb","MySqlWriteConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=write_mysql_testdb","MsSqlReadConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=read_mssql_testdb","MsSqlWriteConnectionString": "server=127.0.0.1;uid=root;pwd=root;database=write_mssql_testdb"}

最后,在业务的Service中,读有两个,按类型区分,写有两个,按类型区分,代码如下:

    public class GoodsService : IGoodsService{private readonly IDapperPlusWrite _mySqlDapperWrite;private readonly IDapperPlusWrite _msSqlDapperWrite;private readonly IDapperPlusRead _mySqlDapperRead;private readonly IDapperPlusRead _msSqlDapperRead;public ShopService(IEnumerable<IDapperPlusWrite> dapperWrites, IEnumerable<IDapperPlusRead> dapperReads){foreach (var dapperWrite in dapperWrites){switch (dapperWrite){case MySqlDapperPlusWrite mySqlDapperPlusWrite:_mySqlDapperWrite = mySqlDapperPlusWrite;break;case MsSqlDapperPlusWrite msSqlDapperPlusWrite:_msSqlDapperWrite = msSqlDapperPlusWrite;break;}}foreach (var dapperRead in dapperReads){switch (dapperRead){case MySqlDapperPlusRead mySqlDapperPlusRead:_mySqlDapperRead = mySqlDapperPlusRead;break;case MsSqlDapperPlusRead msSqlDapperPlusRead:_msSqlDapperRead = msSqlDapperPlusRead;break;}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些积累

为什么80%的码农都做不了架构师&#xff1f;>>> 查看某文件属于哪个RPM包。 我一直使用的是ubuntu&#xff0c;用的是apt-get所以。。&#xff0c;答案是-qf&#xff0c;没有环境没法实验&#xff0c;也不想装rpm在我的ubuntu里。 run level 这个不同的linux发行版…

数据庞大繁杂,如何精简挖掘?

从数据中抽取信息从信息中挖掘知识随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。可谓是兵马未至&#xff0c;数据先行。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。…

xps13安装linux系统,[操作系统]Dell XPS 13 (9360)安装配置 ubuntu 16.04 实现 win10 Linux双系统...

[操作系统]Dell XPS 13 (9360)安装配置 ubuntu 16.04 实现 win10 Linux双系统0 2017-07-17 12:00:18博主今日投身于SLAM的研究事业&#xff0c;放弃了以往win10下各种IDE的开发环境&#xff0c;选择了在自己的xps13上装上ubuntu16.04&#xff0c;投身于更为方便的linux进行学习…

Magicodes.IE之总体教程

简介Magicodes.IE&#xff0c;导入导出通用库&#xff0c;支持Dto导入导出、模板导出、花式导出以及动态导出&#xff0c;支持Excel、Csv、Word、Pdf和Html。内容合集Magicodes.IE.AspNetCore之一行代码多格式导出Excel模板导出之动态导出 Magicodes.IE Excel合并行数据导入教程…

关于VC6.0 MSDEV.EXE-应用程序错误0x5003eaed指令引用的0x000...

2019独角兽企业重金招聘Python工程师标准>>> 错误现象&#xff1a;VC6.0中&#xff0c;点击add source file或是add header file,add file to project等菜单&#xff0c;将会出现MSDEV.EXE-应用程序错误&#xff0c;并引起VC6.0的自动关闭。 错误原因&#xff1a;可…

pixelbook安装linux系统,谷歌Pixelbook可以运行Fuchsia操作系统 正测试

【PConline资讯】早在2016年就有消息称&#xff0c;谷歌正在开发一款独立于Android和Chrome OS之外的操作系统 “Fuchsia”。尽管迄今为止谷歌根本没有详细说明这个操作系统&#xff0c;但最新文档指出&#xff0c;谷歌Pixelbook 笔记本可以运行Fuchsia系统。据报道&#xff0c…

AlphaGo Zero又上《Science》封面!谷歌的人工智能又干翻人类了!

全世界只有3.14 % 的人关注了数据与算法之美卢sir在回顾2018年的时候&#xff0c;发现居然遗漏了一个“知识点”——在2018年的最后一个月&#xff0c; AlphaGo Zero登上了世界顶级学术期刊《科学》杂志的封面。Google设计了AlphaGo&#xff08;围棋机器人&#xff09;的事早已…

【译】.NET 6 Preview 4 Released

.NET 6 Preview 4 Released我们很高兴地发布 .NET 6 Preview 4。现在&#xff0c;我们到 .NET 6 正式发布尚有一半。现在是再次浏览.NET 6 全部内容的好时机&#xff0c;就像第一篇预览文章一样。许多功能处于最终形式&#xff0c;而其他功能也将很快发布&#xff0c;因为已经为…

在终端(Terminal)中用颜色显示不同类型文件

2019独角兽企业重金招聘Python工程师标准>>> 对于从Unix/Linux平台转到Mac的同学来说&#xff0c;“终端”是经常要使用的一个工具。不过可能有很多人已经发现了&#xff0c;当我们使用ls命令来显示目录内容的时候&#xff0c;“终端”对于目录、可执行文件等特殊类…

马斯克要干翻人工智能,“神经蕾丝”能让每个人都能当钢铁侠

全世界只有3.14 % 的人关注了数据与算法之美爱因斯坦曾说过&#xff0c;“在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。”这不2019年刚到来&#xff0c;“硅谷钢铁侠”马斯克就定好了“小目标”了——“给我10年时间&#x…

都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...

在大数据项目开发过程中&#xff0c;ETL&#xff08;Extract-Transform-Load&#xff09;是必不可少。即便目前 JSON 非常流行&#xff0c;开发人员也有必定会有对远古系统的挑战&#xff0c;而 XML 格式的数据源作为经典存在浑身上下散发着浓浓 old money 的味道。因为有 Newt…

linux c中动态申请二维数组,Linux C 编程详解第五篇:二维数组

二维数组 :存储类型 数据类型 数组名[行数][列数]列数不能够省略 , 行数可以省略数组元素的引用 : 数组名[行标][列标]练习 :1.找出二维数组中的最大值, 如果有多个最大值, 找出其位置以及数值.(不要排序).#include int main(int argc, const char *argv[]){int a[3][4] {{1,2…

js与Ajax实现浮动留言板(留言写入sqlserver数据库)

XXX.aspx页面&#xff1a; <script type"text/javascript" src"JScript/jquery.js"></script> <link rel"stylesheet" type"text/css" href"FastFeedBack/panel/jquery.panel.css"/> <link rel"s…

新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...

之前小木推荐“德国MINICUTE人体工学腰垫”受到了大家一致的好评和争相购买。小木为什么推荐这一款原因是&#xff1a;据统计&#xff0c;我国腰椎病患者已经突破2亿人。30~40岁人群中&#xff0c;患有颈腰椎病的占比59.1%&#xff01;而且有着越来越年轻化的趋势&#xff0c;办…

微软放弃IE浏览器 应尽快完成国产化替代

不久前&#xff0c;微软决定在2022年6月15日彻底放弃IE浏览器&#xff0c;全线改用Microsoft Edge。微软官方表示&#xff0c;"我们宣布&#xff0c;Windows 10上的Internet Explorer的未来在Microsoft Edge中&#xff0c;Internet Explorer 11桌面应用程序将于2022年6月1…

各种流行的编程风格

2019独角兽企业重金招聘Python工程师标准>>> 在过去的N年中&#xff0c;我遇到了很多使用囧然不同风格的开发者&#xff0c;下面是我所知道的一些&#xff0c;你还知道其它的吗&#xff1f; 散弹枪编程 这种编程风格是一种开发者使用非常随意的方式对待代码。“嗯&a…

linux自动跑批,在linux中添加硬盘并在系统启动时自动挂载

前言最近搞Linux时&#xff0c;当初没有考虑完善&#xff0c;只分配了10GB的空间&#xff0c;启动mongodb时直接给我报了一个错误&#xff1a;可用空间太少&#xff0c;虽说加一个参数—smallfiles就可以解决问题&#xff0c;但这治标不治本。所以我参考Adding a New Disk Driv…

没有标题,配得上这款“俄罗斯方块”

在之前的文章时&#xff0c;马斯提到数学存在一种现象叫“梯次掉队”&#xff0c;原因在于孩子的数学思维地基没有打牢。&#xff08;传送门&#xff09;提到初中孩子需要空间想象能力时&#xff0c;很多父母疑惑为何需要&#xff1f;关于这点&#xff0c;小木给大家说明下&…

linux仿真速度快吗,Linux上安装使用最快的GPU加速的终端仿真器Alacritty

这个简单的教程展示了如何通过PPA在Ubuntu 20.04, Ubuntu 20.10, Linux Mint 20中安装最快的终端模拟器Alacritty。Alacritty是一个跨平台、GPU加速的终端模拟器&#xff0c;是现有最快的终端模拟器。可以在macOS、Linux、BSD和Windows上工作。它是一款专注于简单性和性能的免费…

使用c#接入华为云-内容审核

背景内容审核&#xff08;Content Moderation&#xff09;&#xff0c;是基于图像、文本、音视频的检测技术&#xff0c;可自动检测涉黄、涉政涉暴、涉政敏感人物、图文违规等内容&#xff0c;对用户上传的图片、文字、音视频进行内容审核&#xff0c;以满足上传要求&#xff0…