黄岛网站建设公司哪家好商场设计效果图
news/
2025/10/8 9:21:22/
文章来源:
黄岛网站建设公司哪家好,商场设计效果图,河南省建设工程质量安全监督网站,统计工具一. 前言 从本节开始#xff0c;将陆续的介绍几种框架搭建组合形式#xff0c;分析每种搭建形式的优势和弊端#xff0c;剖析搭建过程中涉及到的一些思想和技巧。
(一). 技术选型 1. DotNet框架#xff1a;4.6 2. 数据库访问#xff1a;EF 6.2 (CodeFrist模式) 3. IOC框架…一. 前言 从本节开始将陆续的介绍几种框架搭建组合形式分析每种搭建形式的优势和弊端剖析搭建过程中涉及到的一些思想和技巧。
(一). 技术选型 1. DotNet框架4.6 2. 数据库访问EF 6.2 (CodeFrist模式) 3. IOC框架AutoFac 4.8.1 和 AutoFac.MVC5 4.0.2 4. 日志框架log4net 2.0.8 5. 开发工具VS2017
(二). 框架目标 1. 一个项目同时连接多个相同种类的数据库在一个方法中可以同时对多个数据进行操作。 2. 支持多种数据库SqlServer、MySQL、Oracle灵活的切换数据库。 3. 抽象成支持多种数据库连接方式EF、ADO.Net、Dapper。 二. 搭建思路 1. 层次划分 将框架分为Ypf.Data、Ypf.IService、Ypf.Service、Ypf.DTO、Ypf.Utils、Ypf.AdminWeb 六个基本层后续还会补充 Ypf.Api层每层的作用分别为 ①. Ypf.Data存放连接数据库的相关类包括EF上下文类、映射的实体类、实体类的FluentApi模式的配置类。 ②. Ypf.IService业务接口层用来约束接口规范。 ③. Ypf.Service业务层用来编写整套项目的业务方法但需要符合Ypf.IService层的接口约束。 ④. Ypf.DTO: 存放项目中用到的自定义的实体类。 ⑤. Ypf.Utils: 工具类 ⑥. Ypf.AdminWeb: 表现层系统的展示、接受用户的交互传递数据业务对接。
PS后续会补充Ypf.Api层用于接受移动端、或其他客户端接口数据进行相应的业务对接处理。
2. Ypf.Data层的剖析 把EF封装到Ypf.Data层通过Nuget引入EF的程序集利用FluentAPI的模式先进行配置实际项目多种模式配合使用该层的结构如下 PSEF的关闭默认策略、EF的DataAnnotations、EF的FluentAPI模式 在关闭数据库策略的情况下无论哪种模式都需要显式的 ToTable来映射表名否则会提示该类找不到。
EF配置详情参考 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
3. Service层和IService层简单的封装一下
【PS这个地方是个关键点需要考虑多种不同的写法然后进行封装】 ①.【Ypf.Service】层只有一个BaseService泛型类封装【Ypf.IService】层并没有设置IBaseService接口设置了一个IServiceSupport标识接口(没有任何内容)需要“AutoFac注入”的所有子类IxxxService都要实现IServiceSupport接口。 ②.【Ypf.Service】层中有很多自定义的 xxxService每个xxxService都要实现【Ypf.IService】层的IxxxService层接口这里的xxxService层划分并不依赖表名划分自定义根据业务合理起名即可。 ③. xxxService类中利用using() 包裹EF的上下文“db”便于释放然后把EF上下文传入到泛型的BaseServiceT类的构造函数中可以调用其封装的方法。 ④.利用AutoFac实现在控制器中属性的注入相应的配置均写在Global文件中。 ⑤.控制器中的Action仅仅负责传值和简单的一些判断核心业务全部都写在Service层中。
4. 利用AutoFac实现Ypf.AdminWeb层与Ypf.Service层解耦 利用AutoFac进行整合使Ypf.AdminWeb层只需要引入YpfIService层即可但需要改一下Ypf. Service输出路径使其程序集输出到Ypf.AdminWeb层中。 解析利用AutoFac把Ypf.Service中的所有类注册给它的全部实现接口一个类可能实现了多个接口并且把实现类中的属性也进行注册实现类中也可能包含属性的注入。
AutoFac的配置详情参考 第二节框架前期准备篇之AutoFac常见用法总结
5. 将Log4net整合到Ypf.Utils层中 解析主要配置了两种模式输出到“txt文本文档”和“SQLServer数据库中”。其中“文本文档”又分了两种模式全部输入到一个文档中 和 不同类型的日志输入到不同文档下在调用的时候通过传入参数来区分存放在哪个文件夹下。
Log4net的配置详情参考 第一节框架前期准备篇之Log4Net日志详解
6. 完善【Ypf.Service】层中BaseService的封装 封装EF常用的增删改查的方法这里暂时先不扩展EF插件的方法分享一下代码。 BaseService 三. 剖析核心
1. 如何实现同时操作多个相同类型的不同结构的数据库。 首先【Ypf.Data】层中新建一个存放的实体的文件夹如“EntityTest”用来引入另外一个数据库的存放实体和DbContext上下文然后在【Ypf.Service】层中双Using往BaseService类中传入不同db上下文即可实现访问不同的数据库如果要对多个数据库开启事务手动开启msdtc服务然后使用Transactions包裹进行事务一体操作。 详细的使用步骤见实战测试。
2. 体会【Ypf.IService】层 和 引入IOC框架的作用
【PS依赖倒置原则的核心就是面向接口编程】
(1). 接口层的作用 a. 便于开发人员分工开发写业务的单独去写业务对接的单独去对接而且事先把接口协议定好那么对接的人员就不需要等业务人员全部写完代码就可以对接了无非最后再测试而已。 b. 降低修改代码造成的成本代价使以接口为基础搭建起来的框架更加稳健。 举例1 三层架构 数据库访问层、业务逻辑层、UI调用层。 非此套框架的模式后面考虑这么改进 ①. 数据库访问层中有一个 MySqlHelp类提供链接MySQL数据增删改查的方法。 ②. 业务逻辑层有一个登录业务 CheckLogin(MySqlHelp mysql,string userName,string pwd)。 ③. UI调用层要调用CheckLogin方法这时候实例化一个MySqlHelp对象传到CheckLogin方法中即可。 有一个天要求支持oracle数据库所以数据库访问层中增加了一个oracleHelper类UI调用层按照常规实例化了一个oracleHelper对象传到CheckLogin方法中发现我的天CheckLogin竟然不支持oracleHelper对象同时发现类似的所有业务层的方法都不支持oracleHelper类这个时候悲剧就发生了如果全部改业务层的方法基本上完蛋。 所以根本的解决方案依赖倒置原则即面向接口编程。 ①. 数据库访问层声明一个接口IHelper,里面有增删改查方法MySqlHelp和oracleHelper都实现IHelper接口。 ②. 业务逻辑层有一个登录业务改为依赖接口IHelper CheckLogin(IHelper iHelper,string userName,string pwd)。 ③. UI调用层要调用CheckLogin方法想连哪个数据就实例化哪个 eg IHelper iHelpernew MySqlHelp(); 或者 IHelper iHelpernew oracleHelper()此处考虑和IOC框架结合连代码都不用改直接改配置文件就行了就可以切换实例然后调用CheckLogin即可。 举例2 类A类B类C。 类A中的方法需要传入类B的实例通常在类A中实例化一下类B但如果想让类A依赖类C你会发现改动非常大类A中的方法原先是类B的参数全部需要改。 所以解决方案类B和类C都实现接口I类A中方法的参数由原先的类B改为接口I这样类A想依赖谁只需要 I inew B() 或者 I inew C(),所有的方法都不用改也可以再升级一下这里不直接实例化利用IOC框架或者手写反射只需要改一下配置文件就能控制 到底是 new B 还是 new C 。 (2). 引入IOC框架的作用 解决的问题1现有的框架模式(Service层using引入EF上下文传入到BaseService类中)如何实现快速切换数据库 a首先在【Ypf.Data】层引入MySQL数据库所需要的程序集配置文件也改成连接MySQL的。(此处需要详细测试) b. 新建一个【Ypf.Service2】层同样实现对应业务只不过是连接不同类型的数据库(比如它连接的是MySql数据库)生成路径也输出到【Ypf.AdminWeb】层中最后只需要改一下AutoFac读取的配置文件“DllName”改为“Ypf.Services2”即可就可以实现切换数据。 总结该模式虽然能实现“相同业务、相同表”的不同类型的数据库切换比如SQLServer→MySQL但是需要重新写一个整层【Ypf.Service2】,虽然基本上是复制但是有一定工作量的。但是另外通过手写IOC也可以实现(反射简单工厂配置文件)看不到IOC框架的优势所在。 IOC强大之处在于框架本身为我们封装好了很多便于开发的方法拿AutoFac来说吧能灵活的控制创建对象的每次请求都创建、单例、一个Http请求内单例
四. 实战测试
这里准备两个数据库分别是YpfFrame_DB 和 YpfFrameTest_DB
①YpfFrame_DB中用到了表T_SysUser 和 T_SysLoginLog表结构如下 ②. YpfFrameTest_DB 表中用到了T_SchoolInfor表结构如下 开始测试
1. 测试增删改查包括基本的事务一体。
在【Ypf.IService】层中新建ITestService接口在【Ypf.Service】层中新建TestService类实现ITestService接口 定义TestBasicCRUD方法进行测试代码如下。 1 /// summary2 /// 1.测试基本的增删改查,事务一体3 /// /summary4 /// returns/returns5 public int TestBasicCRUD()6 {7 using (DbContext db new MyDBContext1())8 {9 BaseServiceT_SysUser T_SysUserService new BaseServiceT_SysUser(db);
10 BaseServiceT_SysLoginLog T_SysLoginLogService new BaseServiceT_SysLoginLog(db);
11 //1.增加操作
12 T_SysUser t_SysUser new T_SysUser()
13 {
14 id Guid.NewGuid().ToString(N),
15 userAccount 123456,
16 userPwd XXX,
17 userRealName XXX,
18 appLoginNum 1,
19 addTime DateTime.Now
20 };
21 T_SysUserService.AddNo(t_SysUser);
22
23 //2.修改操作
24 T_SysLoginLog t_SysLoginLog T_SysLoginLogService.Entities.Where(u u.id 1).FirstOrDefault();
25 if (t_SysLoginLog ! null)
26 {
27 t_SysLoginLog.userId xxx;
28 t_SysLoginLog.userName xxx;
29 T_SysLoginLogService.ModifyNo(t_SysLoginLog);
30 }
31 //3.提交操作
32 return db.SaveChanges();
33 }
34 } 2. 测试一个方法中查询多个数据库。
在ITestService接口中定义ConnectManyDB方法并在TestService中实现该方法代码如下 1 /// summary2 /// 2. 同时连接多个数据库进行3 /// /summary4 /// param nameuserList/param5 /// param nameschoolList/param6 public void ConnectManyDB(out ListT_SysUser userList, out ListT_SchoolInfor schoolList)7 {8 using (DbContext db new MyDBContext1())9 using (DbContext db2 new MyDBContext2())
10 {
11 BaseServiceT_SysUser T_SysUserService new BaseServiceT_SysUser(db);
12 BaseServiceT_SchoolInfor T_SchoolInforService new BaseServiceT_SchoolInfor(db2);
13
14 //执行数据库查询操作
15 userList T_SysUserService.GetListBy(u true);
16 schoolList T_SchoolInforService.GetListBy(u true);
17 }
18 } 分析想连接几个数据库就需要先在【Ypf.Data】层中新建对应数据库的实体、实体配置文件、EF上下文然后在【Ypf.Service】层对应的方法中实例化对应的 EF上下文然后传入到BaseService类中即可。
3. 测试一个方法中事务一体处理多个数据库的crud操作。 在ITestService接口中定义ManyDBTransaction方法并在TestService中实现该方法代码如下 1 /// summary2 /// 3. 同时对多个数据库进行事务一体的CRUD操作3 /// 注需要手动开启msdtc服务(net start msdtc)4 /// /summary5 public void ManyDBTransaction()6 {7 using (TransactionScope trans new TransactionScope())8 {9 try
10 {
11 DbContext db new MyDBContext1();
12 DbContext db2 new MyDBContext2();
13
14 BaseServiceT_SysUser T_SysUserService new BaseServiceT_SysUser(db);
15 BaseServiceT_SchoolInfor T_SchoolInforService new BaseServiceT_SchoolInfor(db2);
16
17 //执行业务操作
18 T_SysUserService.DelBy(u u.id 1);
19 T_SchoolInforService.DelBy(u u.id 1);
20
21 //最终提交事务
22 trans.Complete();
23 }
24 catch (Exception ex)
25 {
26 var msg ex.Message;
27 //事务回滚
28 Transaction.Current.Rollback();
29 throw;
30 }
31 }
32 } 分析同时连接多个数据库并对多个数据库进行事务性的crud操作这个时候必须用 【TransactionScope事务】前提要手动 【net start msdtc 】开启对应服务这样整个事务通过“Complete”方法进行提交通过Transaction.Current.Rollback()方法进行事务回滚各自db的SaveChange不起作用但还是需要SaveChange的。
4. 测试xxxSevice子类中也可以通过AutoFac进行IxxxService的模式进行属性的注入。 在【Ypf.IService】层中新建ITestService2接口在【Ypf.Service】层中新建TestService2类实现ITestService接口 定义GetUserInfor方法进行测试代码如下。 View Code
在TestService中定义ITestService2属性如下 在TestService中定义如下方法内部用TestService2进行调用可以调用成功从而证明xxxSevice子类中也可以通过AutoFac进行IxxxService的模式进行属性的注入。 5. 测试Log4net的分文件夹和不分文件的使用。 先分享配置文件 View Code
分享对应的封装类 View Code
代码测试 !
作 者 : Yaopengfei(姚鹏飞)博客地址 : http://www.cnblogs.com/yaopengfei/声 明1 : 本人才疏学浅用郭德纲的话说“我是一个小学生”如有错误欢迎讨论请勿谩骂^_^。声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址否则保留追究法律责任的权利。分类: 11-框架搭建
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931307.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!