世安建设有限网站福州网站设计哪家做的好
news/
2025/9/26 22:51:17/
文章来源:
世安建设有限网站,福州网站设计哪家做的好,建设网站报告,北京做网站比较好的公司上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架#xff0c;具体为什么那样设计我也已经在第十篇文章中进行了说明。不过文章发布后很多人都说了这样的分层不是很合理#xff0c;什么数据库实体应该跟仓储放在一起形成领域对象#xff0c;什么ViewModel应… 上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架具体为什么那样设计我也已经在第十篇文章中进行了说明。不过文章发布后很多人都说了这样的分层不是很合理什么数据库实体应该跟仓储放在一起形成领域对象什么ViewModel应该放在应用层结构仓储层与UI层。其实我想说的是这样都没问题看你自己的理解了我上篇文章已经说了如果你愿意完全可以把所有的层融合在一起随意合并分离这个依你个人喜好。我也是本着简单原则以及合适原则的思想来进行那样的分层结构觉得这样层次更分明些。还有虽然现在DDD的思想很流行但是实现起来确很复杂小项目就别那样折腾了。如果你有不同的意见欢迎加群讨论。什么你问我群号自己找去我才不会告诉你本文已收录至《.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划》作者依乐祝原文地址https://www.cnblogs.com/yilezhu/p/10112406.html写在前面今天我们就进入.NET Core实战项目之CMS的开发篇了在开始之前呢我们首先需要把我们前面设计的逻辑模型转换成对应的物理模型再根据我们物理模型生成相应的数据库脚本接着我们就新建数据库然后执行下我们生成的脚本即可。当然这么多表如果一个一个的写对应的数据库实体模型一个一个的写仓储层代码以及服务层代码感觉就是在搬砖啊有木有所以当然得自己实现个代码生成器来自动生成这些代码了下面我们一步步来先生成下数据库然后再打造一个实体模型的代码生成器吧数据库生成生成物理模型首先用pdm打开我们设计的逻辑模型文件后缀名是ldm的文件如下图所示依次点击“Tools”-》Generate Logical Data Model,如下图所示。或者直接使用快捷键CtrlShiftP 打开物理模型生成选项对话框。如下图所示选择号对应的数据库后自定义物理模型的名称代码后点击确定即可生成物理模型。这里数据库类型有很多选择如mysql,sqlserver,oracle等等我们选择sqlserver2008,你可以随意从下拉框选择一个数据库进行生成当然要跟你的数据库对应注意这里生成的物理模型默认是不会生成注释的如下图所示怎么办呢如何才能讲Name 列的内容拷贝到Comment这个里面呢因为这个Commment里面的内容才会真正的转换到数据库字段的注释。这时候你需要Tools-Execute Commands-Edit/Run Scripts 或者快捷键CtrlShiftX打开脚本执行的窗口然后把下面的代码拷贝进行 run一下即可。代码一:将Name中的字符COPY至Comment中Option Explicit ValidationMode True InteractiveMode im_BatchDim mdl the current model get the current active model Set mdl ActiveModel If (mdl Is Nothing) Then MsgBox There is no current Model ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then MsgBox The current model is not an Physical Data model. Else ProcessFolder mdl End If This routine copy name into comment for each table, each column and each view of the current folder Private sub ProcessFolder(folder) Dim Tab running table for each Tab in folder.tables if not tab.isShortcut then tab.comment tab.name Dim col running column for each col in tab.columns col.comment col.name next end if next Dim view running view for each view in folder.Views if not view.isShortcut then view.comment view.name end if next go into the sub-packages Dim f running folder For Each f In folder.Packages if not f.IsShortcut then ProcessFolder f end if Next end sub这里脚本执行的很快你也可以把脚本保存起来下次再用执行后的效果如下所示我们的Comment这一行的内容已经跟Name一样了数据库脚本生成首先打开我们生成的物理模型扩展名为pdm的文件如下图所示乍一看跟物理模型差不多实际上还是有区别的然后依次如下图所示选择“Database”-Generate Database 或者快捷键CtrlG打开数据库生成选项对话框如下图所示设置一下生成的数据库脚本的路径以及脚本名称即可生成数据库脚本文件如下图所示到我们上面设置的文件夹里即可查看到我们生成的数据库脚本如下图所示数据库生成打开我们的数据库并新建一个名为CzarCms的新的数据库如下图所示选择我们新建的数据库然后按照如下图所示的方式打开我们刚才生成的数据库脚本如下图所示确认一下目前选择的是你刚新建的数据库然后点击执行执行下脚本不出以外的话会出现如下图所示的“命令已成功完成”的消息这表示脚本执行成功了然后刷新下我们刚才的数据库可以看到我们的表已经生成成功了这里你可以检查下看看生成的数据库表有没有问题如果有问题的话重新走一遍流程生成脚本然后执行下就行了不过需要注意的是如果你数据库中有数据就要当心了重新生成的脚本会drop掉你的表重新创建所以如果是个别字段出问题的话就逻辑模型以及物理模型修改后手动在数据库中修改即可这里我给每个表的主键设计了自增给isdelete等等设置了默认的0以及addtime设置了getdate()等等。实体模型生成器编写好了上面我已经带着你一步一步的演示了数据库的创建过程下面我就带着你实现一个简单的POCO实体对象的代码生成器吧什么市面上不是有很多代码生成器吗靠我就是要带着你自己实现一个咋滴是用别人的爽还是用自己实现的爽呢自己琢磨吧思考大家先脑补一下如果是你想根据数据库实现一个代码生成器你的思路是怎样的呢是不是首先得获取下数据库里面的所有的表然后获取这些表对应的列以及列的类型是否为空等等信息。然后再建一个模板循环这些表的信息来根据模板创建对应的文件呢。至于模板文件可能你会想到T4或者CodeSmish模板等等可这些都太复杂了复杂的语法以及灵活性的问题我这里选择另一个文本文件的形式来进行代码的生成。这个代码生成器的灵感以及部分代码来自于Zxw.Framework.NetCore这个框架的github地址是https://github.com/VictorTzeng/Zxw.Framework.NetCore/tree/master/Zxw.Framework.NetCore 有兴趣的小伙伴可以看下。下面就让我们简单实现下我们自己的实体模型代码生成器吧.实体代码生成器首先我们创建一个Option对象来接收我们所需要的参数比如说数据库类型数据库连接字符串作者实体模型的命名空间等等如下所示 /// summary /// yilezhu /// 2018.12.12 /// 代码生成选项 /// /summary public class CodeGenerateOption { /// summary /// 数据库连接字符串 /// /summary public string ConnectionString { get; set; } /// summary /// 数据库类型 /// /summary public string DbType { get; set; } /// summary /// 作者 /// /summary public string Author { get; set; } /// summary /// 代码生成时间 /// /summary public string GeneratorTime { get; set; } DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss); /// summary /// 输出路径 /// /summary public string OutputPath { get; set; } /// summary /// 实体命名空间 /// /summary public string ModelsNamespace { get; set; } }从数据库里面获取所有表的脚本,这里我只是简单的实现了下SqlServer的代码后续我会对这块进行提取封装并支持MySql,Oracle,PSQL等等//TODO 从数据库获取表列表以及生成实体对象 if (_options.DbType ! DatabaseType.SqlServer.ToString()) throw new ArgumentNullException(这是我的错目前只支持MSSQL数据库的代码生成后续更新MySQL); DatabaseType dbType DatabaseType.SqlServer; string strGetAllTables SELECT DISTINCT d.name as TableName, f.value as TableCommentFROM sys.syscolumns AS a LEFT OUTER JOIN sys.systypes AS b ON a.xusertype b.xusertype INNER JOIN sys.sysobjects AS d ON a.id d.id AND d.xtype U AND d.name dtproperties LEFT OUTER JOIN sys.syscomments AS e ON a.cdefault e.id LEFT OUTER JOIN sys.extended_properties AS g ON a.id g.major_id AND a.colid g.minor_id LEFT OUTER JOIN sys.extended_properties AS f ON d.id f.major_id AND f.minor_id 0; ListDbTable tables null; using (var conn new SqlConnection(_options.ConnectionString)) { tables conn.QueryDbTable(strGetAllTables).ToList();遍历每个表然后获取每个表对应的列也是只实现的SqlServer的代码 tables.ForEach(item { string strGetTableColumns SELECT a.name AS ColName, CONVERT(bit, (CASE WHEN COLUMNPROPERTY(a.id, a.name, IsIdentity) 1 THEN 1 ELSE 0 END)) AS IsIdentity, CONVERT(bit, (CASE WHEN (SELECT COUNT(*) FROM sysobjects WHERE (name IN (SELECT name FROM sysindexes WHERE (id a.id) AND (indid IN (SELECT indid FROM sysindexkeys WHERE (id a.id) AND (colid IN (SELECT colid FROM syscolumns WHERE (id a.id) AND (name a.name))))))) AND (xtype PK)) 0 THEN 1 ELSE 0 END)) AS IsPrimaryKey, b.name AS ColumnType, COLUMNPROPERTY(a.id, a.name, PRECISION) AS ColumnLength, CONVERT(bit, (CASE WHEN a.isnullable 1 THEN 1 ELSE 0 END)) AS IsNullable, ISNULL(e.text, ) AS DefaultValue, ISNULL(g.value, ) AS CommentFROM sys.syscolumns AS a LEFT OUTER JOIN sys.systypes AS b ON a.xtype b.xusertype INNER JOIN sys.sysobjects AS d ON a.id d.id AND d.xtype U AND d.name dtproperties LEFT OUTER JOIN sys.syscomments AS e ON a.cdefault e.id LEFT OUTER JOIN sys.extended_properties AS g ON a.id g.major_id AND a.colid g.minor_id LEFT OUTER JOIN sys.extended_properties AS f ON d.id f.class AND f.minor_id 0WHERE (b.name IS NOT NULL) AND (d.name TableName)ORDER BY a.id, a.colorder; item.Columns conn.QueryDbTableColumn(strGetTableColumns, new { TableName item.TableName }).ToList();接下来就是对数据库获取的列进行一个转换根据数据库字段类型转换成对应的C#类型了 item.Columns.ForEach(x { var csharpType DbColumnTypeCollection.DbColumnDataTypes.FirstOrDefault(t t.DatabaseType dbType t.ColumnTypes.Split(,).Any(p p.Trim().Equals(x.ColumnType, StringComparison.OrdinalIgnoreCase)))?.CSharpType; if (string.IsNullOrEmpty(csharpType)) { throw new SqlTypeException($未从字典中找到\{x.ColumnType}\对应的C#数据类型请更新DbColumnTypeCollection类型映射字典。); } x.CSharpType csharpType; });既然所有的表以及表对应的列我们都拿到了那么我们就可以进行代码的生成了当然在生成之前还得创建我们的模板文件// 本代码由代码生成器生成请勿随意改动// 生成时间 {GeneratorTime}using System;namespace {ModelsNamespace}{ /// summary /// {Author} /// {GeneratorTime} /// {Comment} /// /summary public class {ModelName} { {ModelProperties} }}看到没有很简单的POCO对象的样子接下来就是生成对应的模板了具体怎么生成呢思考下是不是首先读取模板文件到一个string里面然后就是简单的replace了很简单吧具体的代码我都上传到了Github上文章末尾我会给出地址。另外为了大家引用的方便我已经把这个Czar.Cms.Core项目制作成了Nuget包大家只需要搜索这个包引用下就可以用了什么Nuget包怎么引用啊骚年你可以上天了~测试实体代码生成器Czar.Cms.Test 这个项目添加Nuget包引用引用后的Nuget如下所示接下来就是新建一个测试类然后创建一个依赖注入容器并把我们需要的Option传递进去如下所示 /// summary /// 构造依赖注入容器然后传入参数 /// /summary /// returns/returns public IServiceProvider BuildServiceForSqlServer() { var services new ServiceCollection(); services.ConfigureCodeGenerateOption(options { options.ConnectionString Data Source.;Initial CatalogCzarCms;User IDsa;Password1;Persist Security InfoTrue;Max Pool Size50;Min Pool Size0;Connection Lifetime300;;//这个必须 options.DbType DatabaseType.SqlServer.ToString();//数据库类型是SqlServer,其他数据类型参照枚举DatabaseType//这个也必须 options.Author yilezhu;//作者名称随你不写为空 options.OutputPath E:\workspace\vs2017\Czar.Cms\src\Czar.Cms.Models;//实体模型输出路径为空则默认为当前程序运行的路径 options.ModelsNamespace Czar.Cms.Models;//实体命名空间 }); services.AddSingletonCodeGenerator();//注入Model代码生成器 return services.BuildServiceProvider(); //构建服务提供程序 }接着就是写我们的测试方法了代码如下 [Fact] public void GeneratorModelForSqlServer() { var serviceProvider BuildServiceForSqlServer(); var codeGenerator serviceProvider.GetRequiredServiceCodeGenerator(); codeGenerator.GenerateModelCodesFromDatabase(); Assert.Equal(0,0); }运行一下我们的Live Unit Testing 然后看一下我们的Czar.Cms.Models下面已经生成了对应的实体文件如下图所示随便打开一个看小效果如下我标注的你猜猜看都是对应的哪个Options开源地址这个系列教程的源码我会开放在GitHub以及码云上有兴趣的朋友可以下载查看觉得不错的欢迎StarGitHubhttps://github.com/yilezhu/Czar.Cms码云https://gitee.com/yilezhu/Czar.Cms如果你觉得这个系列对您有所帮助的话欢迎以各种方式进行赞助当然给个Star支持下也是可以滴另外一种最简单粗暴的方式就是下面这种直接关注我们的公众号了第一时间收到更新推送。总结这篇文章我们一步一步的生成了我们的数据库然后手把手带着你实现了我们自己的实体模型代码生成器来简化我们的开发过程。接下来我们就开始实现仓储层应用层的代码了同时我们会提取通用部分的代码来进行模板代码生成来简化我们的工作俗话说的好不会偷懒的程序员不是一个好爸爸好丈夫好儿子减少代码的时间多抽点时间陪陪家人吧如果你有其他想法可以在下方留言或者加群跟大伙一起讨论。共同进步共勉原文相关文章.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入.NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了.NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用.NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程.NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程.NET Core实战项目之CMS 第九章 设计篇-白话架构设计.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计原文地址:https://www.cnblogs.com/yilezhu/p/10112406.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918862.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!