{"id":28394848,"url":"https://github.com/nameisbad/zoey.dapper","last_synced_at":"2025-08-01T01:04:46.082Z","repository":{"id":40917626,"uuid":"152691328","full_name":"NameIsBad/Zoey.Dapper","owner":"NameIsBad","description":"分离SQL语句到文件中","archived":false,"fork":false,"pushed_at":"2022-12-08T09:01:00.000Z","size":3032,"stargazers_count":10,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"dev","last_synced_at":"2025-06-27T00:39:49.290Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NameIsBad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-12T03:51:14.000Z","updated_at":"2021-12-21T09:15:57.000Z","dependencies_parsed_at":"2023-01-25T05:00:48.493Z","dependency_job_id":null,"html_url":"https://github.com/NameIsBad/Zoey.Dapper","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/NameIsBad/Zoey.Dapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NameIsBad%2FZoey.Dapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NameIsBad%2FZoey.Dapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NameIsBad%2FZoey.Dapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NameIsBad%2FZoey.Dapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NameIsBad","download_url":"https://codeload.github.com/NameIsBad/Zoey.Dapper/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NameIsBad%2FZoey.Dapper/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268151825,"owners_count":24204034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-31T02:00:08.723Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-31T19:08:51.017Z","updated_at":"2025-08-01T01:04:46.021Z","avatar_url":"https://github.com/NameIsBad.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# Zoey.Dapper\n\n\u003e 介绍\n\n不知道大家在用`Dapper`的时候*SQL*语句是写到哪的,目前看网上的例子都是写到类里面的.\n\n此项目的目的是把*SQL*语句放到文件(xml)中\n\n目前只是初步版本,只是说明了意图,后面会持续完善和优化\n\n[GitHub 地址](https://github.com/NameIsBad/Zoey.Dapper)\n\n\u003e 功能说明\n\n- SQL 语句单独存放在文件(xml)中\n- 支持配置多文件夹(暂不支持指定具体文件)\n- 实时监听文件变化\n- 支持多数据库(Dapper 本身就支持多数据,为什么这里说支持多数据呢?后面会讲到)\n- 支持读写分离(功能虽然有,但配置看起来不爽,后续应该会优化. 负载平衡算法还未实现)\n\n\u003e 一起看看如何使用\n\n1. 首先我们需要一个*xml*文件,如下:\n\n   ```xml\n   \u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n   \u003csql xmlns=\"http://schema.zoey.com/sql\" domain=\"Default\"\u003e\n   \u003csql-query name=\"Student.GetStudentByID\"\u003e\n       \u003ctext\u003e\n       \u003c![CDATA[\n       SELECT * FROM Student WHERE ID = @ID\n       ]]\u003e\n       \u003c/text\u003e\n   \u003c/sql-query\u003e\n\n   \u003csql-command name=\"Student.UpdateStudentByID\"\u003e\n       \u003ctext\u003e\n       \u003c![CDATA[\n       UPDATE Student SET Age = @Age,Name = @Name WHERE ID = @ID\n       ]]\u003e\n       \u003c/text\u003e\n   \u003c/sql-command\u003e\n   \u003c/sql\u003e\n   ```\n\n   这里我们看下面几点:\n\n   - `sql`节点上的`domain`属性.这里是指定数据库的连接字符串,后面会详细说明\n   - 读写分离就是`sql-query`和`sql-command`节点来判断的\n   - `name`属性目前是所有文件都不能重复\n\n2. 在`Startup`中的`ConfigureServices`添加如下代码:\n\n   ```csharp\n   //SQL文件的读取和监视依赖 IFileProvider\n    var physicalProvider = _env.ContentRootFileProvider;\n    services.AddSingleton\u003cIFileProvider\u003e(physicalProvider);\n\n    services.AddZoeyDapperCore(options =\u003e\n    {\n        //SQL文件夹的路径  支持多个文件夹\n        options.Path = new List\u003cstring\u003e() { \"/Config\" };\n        //监控文件的后缀(默认未 *.*)\n        options.WatchFileFilter = \"*.xml\";\n        //该属性暂时没用\n        options.StartProxy = false;\n    })\n    //添加MSSQLserver\n    //这里说明一下 该方法是非必要的,下面会说\n    .AddMSSQLserver(option =\u003e\n    {\n        //添加数据库连接字符串\n        //这里为什么没用配置文件读取,考虑到可能用到(Secret Manager)\n        //后面可以提供直接从配置文件中读取\n        option.DatabaseElements = new List\u003cDatabaseElement\u003e()\n        {\n            //参数1:唯一名称\n            //参数2:连接字符串\n            new DatabaseElement(\"TESTDB\",\"Data Source=.;Initial Catalog=Test;Integrated Security=True\")\n        };\n        //此处就是上面提到的 domain 节点\n        //每个domain对象有个唯一名称(xml文件domain的节点)\n        //每个domain对象都有 Master(主库) 和 Slave(从库) 的名称(上面配置信息的名称)\n        option.DomainElements = new List\u003cDomainElement\u003e()\n        {\n            new DomainElement()\n            {\n                //xml文件domain节点的名称\n                Name = \"Default\",\n                //主库和从库的名称(上面配置信息的名称)\n                //主库和从库可配多个(负载均衡算法暂没实现)\n                MasterSlaves = new MasterSlaves(\"TESTDB\",\"TESTDB\")\n            }\n        };\n    });\n   ```\n\n   说明:\n\n   - 大家也看到了,此处的配置很是繁琐,上面我也说了,这里应该要优化(但不紧急)\n\n3. 用的时候有两种方式.\n\n   1. 当我们没调用`AddMSSQLserver`时,在`Controller`中:\n\n      ```csharp\n          public class HomeController : Controller\n          {\n              //注入ISqlContext\n              private readonly ISqlContext _sqlContext;\n              public HomeController(ISqlContext sqlContext)\n              {\n                  this._sqlContext = sqlContext;\n              }\n\n              public IActionResult Index()\n              {\n                  List\u003cStudent\u003e student;\n                  //获取 Student.GetStudentByID SQL信息\n                  var sql = _sqlContext.GetSqlElement(\"Student.GetStudentByID\");\n                  using (var db = new SqlConnection(\"Data Source=.;Initial Catalog=Test;Integrated Security=True\"))\n                  {\n                      student = db.Query\u003cStudent\u003e(sql.CommandText, new\n                      {\n                          ID = 1\n                      });\n                  }\n                  return View(student);\n              }\n\n              public IActionResult About()\n              {\n                  //获取 Student.GetStudentByID SQL信息\n                  var sql = _sqlContext.GetSqlElement(\"Student.UpdateStudentByID\");\n                  using (var db = new SqlConnection(\"Data Source=.;Initial Catalog=Test;Integrated Security=True\"))\n                  {\n                      db.Execute(sql.CommandText, new\n                      {\n                          Age = new Random().Next(100),\n                          Name = \"Hello Zoey!\",\n                          ID = 1\n                      });\n                  }\n                  return View();\n              }\n          }\n      ```\n\n      说明:此种方法只是单纯的获取`SQL`信息,没什么特别的.\n\n   2. 下面我们看第二种:\n\n      ```csharp\n          public class HomeController : Controller\n          {\n              //注入 ISqlCommand\n              private readonly ISqlCommand _sqlCommand;\n              public HomeController(ISqlCommand sqlCommand)\n              {\n                  _sqlCommand = sqlCommand;\n              }\n\n              public IActionResult Index()\n              {\n                  //此处直接执行 Query 方法\n                  var student = _sqlCommand.GetSqlElement(\"Student.GetStudentByID\").Query\u003cStudent\u003e(new\n                  {\n                      ID = 1\n                  });\n\n                  return View(student);\n              }\n          }\n      ```\n\n      说明:\n\n      - 用此种方法必须在 `Startup`中调用`AddMSSQLserver`方法\n      - 实现了读写分离,当然 如果主库和从库连接字符串一样就效果了\n      - 这就是为什么说*支持多数据库的原因了*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnameisbad%2Fzoey.dapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnameisbad%2Fzoey.dapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnameisbad%2Fzoey.dapper/lists"}