.Net Core建站(3):搭建三层架构

news/2024/5/20 12:31:50/文章来源:https://blog.csdn.net/weixin_33843947/article/details/93909451

啊,终于到写三层架构的时候了,老实说,我都不知道自己这个算不算三层架构,姑且就当它是吧,具体属于哪一个体系,希望有大佬指点一下(^o^)/

不晓得有人注意到没有,我写了三篇博客,然后就改了三次标题ヽ( ̄▽ ̄)ノ,

从最开始的Core建数据库,到Core数据库操作,再到现在的Core建站,也算是下决心写个系列啊,,感觉要更好久的样子,,

好吧,不要在意那些细节,文中可能会有一些我不知道的坑,毕竟自己也是一边自学一边写,不过保证功能还是能用的,发现有坑记得说,,我改,,(〃'▽'〃)

 

// ===================emmm,我是分割线===================

 

 强烈推荐阅读:设计模式六大原则 讲的相当浅显易懂,,

首先上一个截图,看看现在的项目结构,今天的主角是DataBase文件里面的那一堆项目啊,BLL,DAL和Interface,,Models是生成数据库时使用的,所以今天用不上,,

 

按我的理解,先说说正常的三层架构吧,

UI:界面层,这个层最简单,只是给BLL传递数据,然后,将BLL返回的数据进行一些处理,方便展示,

BLL:业务逻辑层,接收UI层给的数据,写一些业务逻辑,第一步干啥,第二步干啥,什么什么的,然后把界面需要的数据返回出去,感觉更像是一个API

DAL:数据访问层,BLL的业务逻辑处理时,总要涉及到数据库的操作,这时候就要用到DAL层了,,

还有一个Model层,用来传递数据的,,不在三层范畴,,,

 

不知道大家是怎么使用三层的,给大家展示一下以前学校教我们怎么用的三层架构啊,,

分别对应三个类,UI层:HomeController,BLL层:DT_UserBLL,DAL层:DT_UserDAL

 1         // UI层
 2         public IActionResult Index(int userID)
 3         {
 4 
 5             // 根据条件,返回用户
 6             // 和BLL说,给你一堆条件,帮我把这些人找出来
 7             var userList = DT_UserBLL.GetUser(0,18);
 8 
 9             return View(userList);
10 
11         }
 1         /// <summary>
 2         /// BLL层,返回符合条件的用户
 3         /// </summary>
 4         /// <param name="sex">性别</param>
 5         /// <param name="age">年龄</param>
 6         /// <returns></returns>
 7         public List<DT_User> GetUser(int sex, int age)
 8         {
 9 
10             #region 数据校验
11 
12             // 性别检测,0:女,1:男
13             if (sex != 0 && sex != 1)
14                 // 拒绝人妖
15                 return null;
16 
17             // 年龄检测,[0,150]岁
18             if (age < 0 || 150 < age)
19                 // 拒绝妖怪
20                 return null;
21 
22             #endregion
23 
24             // 和DAL说,数据我校验好了,不是恶搞,
25             // 帮我查出来这些人,然后我交给UI就完事儿了,,
26             return DT_UserDAL.GetUser(int sex, int age).ToList();
27         }
 1         /// <summary>
 2         /// DAL层,返回符合条件的用户
 3         /// </summary>
 4         /// <param name="sex">性别</param>
 5         /// <param name="age">年龄</param>
 6         /// <returns></returns>
 7         public IQueryable<DT_User> GetUser(int sex, int age)
 8         {
 9             DbContext DB = new DbContext();
10 
11             return DB.Set<DT_User>().Where(c=>c.Sex==sex&&c.Age==age);
12         }

当时学着感觉蛮好的,挺新奇的一个编程思想,不过每一个数据表对应的DAL里面都得写一套增删查改,,简直是灾难,,[○・`Д´・ ○]

出来实习之后,花了个把星期,把我们老大写的一个框架看明白了,就按图索骥地写了起来,嘿嘿

 

其实和三层架构差不多的,只是把每个数据表对应的DAL里面的增删查改全部提出来,封装成了一个类,,

然后对这个类进行继承,具体操作如下,,,

 

首先啊,要大概了解一下依赖注入,,讲真,这个我也是一脸懵逼,所以就不复制百度百科了,,

说说自己的理解吧,,,,emmm,此处可能有大量谬论,建议不要被我误导了,看看就好,别往心里去

依赖注入这东西就好像一个全局的字典类型变量,,都是以键值对的方式存储的

因为注册依赖注入服务的大部分语法是酱紫的,,,

1 services.AddTransient(typeof(IDT_UserService), typeof(DT_UserService));

而services这个变量的话,就像一个容器,用来存储这些键值对的,具体从哪来的,我也不知道,ヽ( ̄д ̄;)ノ

而要使用的话,语法是酱紫的,,,

 1     public class HomeController : Controller
 2     {
 3         private IDT_UserService _UserService;
 4 
 5         public HomeController(IDT_UserService _UserService)
 6         {
 7             // 依赖注入得到实例
 8             this._UserService = _UserService;
 9         }
10 
11         public IActionResult Index()
12         {
13             ViewBag.list = _UserService.LoadEntites(c => true);
14 
15             return View();
16         }
17     }

对的,完全不需要new,,其原理,,起码我不晓得,感觉甚是神奇,,

先注册一个依赖注入的服务,然后要实例的时候,直接在构造函数里面把键的类型写上就好,,

好了,灌毒就到此为止了,,还是继续上代码吧,,

 

首先,得写一个数据库操作的底层类DalService又因为很多地方调用,所以,肯定是泛型,,

然后为了解耦和方便注入,所以实现一个接口IDalService

我暂时只写了添加和查询的方法,,其他的方法可以自由发挥,,不过记得先写接口,然后去实现接口中新加的方法,,不然无法使用的,,

1     public interface IDalService<T> where T : class, new()
2     {
3         T AddEntity(T entity);
4 
5         IQueryable<T> LoadEntites(Expression<Func<T, bool>> where);
6 
7         int SaveChanges();
8 
9     }
IDalService
 1     /// <summary>
 2     /// 数据访问层:DAL
 3     /// </summary>
 4     /// <typeparam name="T"></typeparam>
 5     public class DalService<T> : IDalService<T> where T : class, new()
 6     {
 7 
 8         private DbContext DbWrite;
 9         
10         /// <summary>
11         /// 获得数据库上下文
12         /// </summary>
13         /// <param name="dbContext">数据库上下文类,各自更改成自己的</param>
14         public DalService(DBCodeFirst dbContext)
15         {
16             DbWrite = dbContext;
17         }
18 
19         public T AddEntity(T entity)
20         {
21             DbWrite.Set<T>().Add(entity);
22             return entity;
23         }
24 
25         public IQueryable<T> LoadEntites(Expression<Func<T, bool>> where)
26         {
27             return DbWrite.Set<T>().Where(where);
28         }
29 
30         public int SaveChanges()
31         {
32             return DbWrite.SaveChanges();
33         }
34 
35     }
DalService

然后就没有DAL层啥事了,,咱们去看BLL层

 

同样的写一个业务逻辑的父级类BllService,依旧是泛型,以及实现接口IBllService

1     public interface IBllService<T>where T : class, new()
2     {
3         T AddEntity(T entity,bool IsSave);
4 
5         IQueryable<T> LoadEntites(Expression<Func<T, bool>> where);
6 
7         int SaveChanges();
8     }
IBllService
 1     /// <summary>
 2     /// 数据逻辑层:BLL
 3     /// </summary>
 4     public class BllService<T> : IBllService<T> where T : class, new()
 5     {
 6 
 7         /// <summary>
 8         /// 数据库服务
 9         /// </summary>
10         protected IDalService<T> DBService;
11 
12         public BllService(IDalService<T> dalService)
13         {
14             this.DBService = dalService;
15         }
16 
17         /// <summary>
18         /// 保存实体
19         /// </summary>
20         /// <param name="entity"></param>
21         /// <param name="IsSave"></param>
22         /// <returns></returns>
23         public T AddEntity(T entity, bool IsSave)
24         {
25             entity = DBService.AddEntity(entity);
26             if (IsSave)
27             {
28                 if (SaveChanges() > 0)
29                     return null;
30             }
31             return entity;
32         }
33 
34         /// <summary>
35         /// 查询数据
36         /// </summary>
37         /// <param name="where"></param>
38         /// <returns></returns>
39         public IQueryable<T> LoadEntites(Expression<Func<T, bool>> where)
40         {
41             return DBService.LoadEntites(where);
42         }
43 
44         /// <summary>
45         /// 保存数据库
46         /// </summary>
47         /// <returns></returns>
48         public int SaveChanges()
49         {
50             return DBService.SaveChanges();
51         }
52     }
BllService

 

然后基本就完成了,,我们可以在BLL层创建一个DT_User的逻辑处理类,继承BllService,并实现接口IDT_UserService

1     public interface IDT_UserService : IBllService<DT_User>
2     {
3         DT_User Insert();
4 
5         List<DT_User> GetList();
6     }
IDT_UserService
 1     public class DT_UserService : BllService<DT_User>, IDT_UserService
 2     { 
 3         /// <summary>
 4         /// 用于实例化父级,DBService变量
 5         /// </summary>
 6         /// <param name="dal"></param>
 7         public DT_UserService(IDalService<DT_User> dal) : base(dal)
 8         {
 9 
10         }
11 
12         public DT_User Insert()
13         {
14             DT_User user = new DT_User
15             {
16                 Password = new Random().Next(0, 101) + "",
17                 UserName = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
18             };
19             return AddEntity(user, true);
20         }
21 
22         public List<DT_User> GetList()
23         {
24             return LoadEntites(c => true).ToList();
25         }
26 
27     }
DT_UserService

 

最后使用的话,要把他们统统注册到服务里面,新建一个类DIBllRegister,用来注册这些和数据库相关的服务

 1     /// <summary>
 2     /// Bll层依赖注入
 3     /// </summary>
 4     public class DIBllRegister
 5     {
 6 
 7         public void DIRegister(IServiceCollection services)
 8         {
 9             // 用于实例化DalService对象,获取上下文对象
10             services.AddTransient(typeof(IDalService<>), typeof(DalService<>));
11 
12             // 配置一个依赖注入映射关系 
13             services.AddTransient(typeof(IDT_UserService), typeof(DT_UserService));
14         }
15     }
DIBllRegister

Startup的ConfigureServices方法中添加两行代码

 1         /// <summary>
 2         /// 运行时调用此方法。使用此方法向容器添加服务。
 3         /// </summary>
 4         /// <param name="services"></param>
 5         public void ConfigureServices(IServiceCollection services)
 6         {
 7             services.AddOptions();
 8 
 9             // 数据库连接字符串
10             var conStr = Config.GetVal<string>(ConfigKey.ConStr);
11             services.AddDbContext<DBCodeFirst>(options => options.UseSqlServer(conStr));
12 
13             DIBllRegister bllRegister = new DIBllRegister();
14             bllRegister.DIRegister(services);
15             
16             services.AddMvc();
17         }

 

然后我们就可以愉快的使用三层架构来写项目了,,ヽ(≧∀≦)ノ

示例以及项目结构如下:

运行结果:

 

 注意事项:

  1. BLL层的类一定要继承BllService,并实现它对应的接口,参考上文DT_UserService类的格式
  2. BLL,DAL任何类要添加方法时,一定要在对应的接口中有个同样的入口,不然无法调用
  3. BLL层添加类时,记得在DIBllRegisterDIRegister中添加一行注册服务的代码,不然无法调用
  4. 差不多就这些,我想起来了再加,,,

 

其实这个是我从Framework搬过来的,心塞得简直不要不要的,,,填坑日记就不写出来了,,

具体的搭建思想也不太好用文字表述,大佬不要吐槽,萌新可以照着步骤去建一个小项目调试着看,,

个人感觉还是比较好懂的,,毕竟,基本上全是核心代码还带注释,加一个使用样例,

 

然后就是下集预告了,云服务器的FTP发布和数据库连接吧,,毕竟云服务器到手辣么久了,也该拉出来溜溜,,(❁´◡`❁)*✲゚*

最后,,有坑记得说,,,,

 

转载于:https://www.cnblogs.com/Onlooker/p/8231522.html

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

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

相关文章

计算机技术英语网站,中国致力于成为计算机技术强国

China is ramping中国正在努力致力于成为世界计算机技术强国。JaguarThe US owned Jaguar has a top speed of 1.75 petaflopsIts Nebulae(星云) machine at the National Super Computer Center in Shenzhen, was ranked second on theFor the first time, a second Chinese s…

用CSS网站布局之十步实录

用css网站布局之十步实录 目录&#xff1a; 点击链接查看教程具体内容&#xff01;第一步&#xff1a;规划网站[url]http://www.52css.com/article.asp?id175[/url]第二步&#xff1a;创建html模板及文件目录等[url]http://www.52css.com/article.asp?id176[/url]第三步&…

为什么你的网站经常被DDOS功击?

DDOS功击主要是通过恶意软件或者“钓鱼”控制大量真实用户电脑&#xff0c;伪装成大量的合法请求在短时间内容对目标服务器发起功击&#xff0c;占用目标服务器大量的网络资源。由于控制的是真实用户电脑&#xff0c;系统很难区分功击和访问用户&#xff0c;所以导致服务器处理…

夺命雷公狗—玩转SEO---25---DEDE快排关键词布局,标题,关键词,描述,LOGO

快排&#xff0c;主要是在网站被收录了后可以快速进行排名&#xff0c;重点还是看关键词的竞争度的大小来决定关键词的排名~~&#xff01; 标题&#xff0c;我们需要有一个符合优化的标题才可以&#xff0c;标题的好坏我们首先要做到关键词的定位&#xff0c;定位那么我们首先就…

分享一些好用的网站

前言 这两年收藏了不少网站&#xff0c;特地整理一下&#xff0c;把一些大家都可能用得上的分享出来&#xff0c;希望能对你有用。 考虑到有一些网站大多数人都知道&#xff0c;所以我就不列出来了。 我把这些网站分为了几大类&#xff1a; 工具类素材类社区类工具类 1、start.…

SEO 搜索引擎优化

我们每天都在做排名&#xff0c;做优化&#xff0c;那么如果我们要新做一个站且要利于SEO&#xff0c;那么我们应该怎么做呢&#xff1f;这里简单的讲述五大点。分别是网站前期的策划&#xff0c;建立有利于SEO的后台程序&#xff0c;快速被收录的方法&#xff0c;分析网站的日…

web前端开发项目资源网站,私家珍藏!

1.CodePen&#xff1a; http://codepen.io/ 网站里有很多很酷的特效&#xff0c;而且可以看到效果的源代码&#xff0c;也可以看到实现效果&#xff0c;是一个非常不错的前端开发学习资源网站。 这个是CodePen网站里的一个效果的源码截图&#xff0c;是不是很酷呀&#xff01; …

(收藏) 浅谈大型网站动态应用系统架构

动态应用&#xff0c;是相对于网站静态内容而言&#xff0c; 是指以c/c、php、Java、perl、.net等 服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通 常与数据库系统、缓存系统、分布式存储系统等密不可分。 大型动态应用…

传统IDC部署网站(六)

2019独角兽企业重金招聘Python工程师标准>>> 26. alias 别名 一条命令的另外一个名字&#xff0c;你可以理解为外号。 [rootlocalhost /]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 ^C [rootlocalhost /]# alias viens0s3vi /etc/sysconfig/network-scripts…

免费建站系统 Joomla 3.9.5 发布

Joomla 3.9.5现已推出。这是针对3.x系列Joomla的安全修复程序版本&#xff0c;它解决了三个安全漏洞&#xff0c;包含20多个错误修复和改进。 什么是3.9.5&#xff1f; Joomla 3.9.5包含三个安全漏洞修复程序以及一些错误和改进&#xff0c;包括&#xff1a; 安全问题已修复 低…

非常酷的国外网站导航设计案例欣赏

作为网站最重要的组成部分之一&#xff0c;导航能够引导用户浏览网站中的更多内容。优秀的导航应该和网页内容完美的融合在一起&#xff0c;因此设计前需要设仔细分析网页结构。这篇文章收集了20个漂亮的网站导航设计案例&#xff0c;希望这些优秀的实例能给你带来灵感。New Ci…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

分享最新收集的HTML5和CSS3的网站设计模板

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-8-9 来源&#xff1a;GBin1.com 设计专业并且简洁的网站模板可以帮助我们更容易的开发和设计网站页面。作为最新最流行的web技术HTML5和CSS3技术来说&#xff0c;使用它们构建的模板更加简洁和…

谁在使用我的网站——用户行为分析

谁在使用我的网站——用户行为分析 前面根据用户的特征对用户做了分类&#xff0c;设定了一些常用的用户指标和值得关注的用户指标&#xff0c;基于这些分类用户指标的分析可以发现用户运营和推广中的诸多问题&#xff0c;其中活跃用户和流失用户的定义中已经用到了与用户行为相…

优化网站设计(四):对资源启用压缩

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices fo…

网站初学笔记3-HTML实用元素3

HTML-复选框 <html> <body> <form>我喜欢自行车&#xff1a;<input type"checkbox" name"Bike"><br />我喜欢汽车&#xff1a;<input type"checkbox" name"Car"></form> </body><…

ibits和oracle模糊查询,iBATIS 模糊查询LIKE (转) - 我的博客 - ITeye技术网站

iBatis 开发指南告诉我们&#xff0c;当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件 person.xml 中的配置为Xml代码 select id as id,name as name,passwd as passwd from person(name like #name#)select id as id,name as name,passwd as passwd fro…

腾讯云linux建站教程视频,手把手教你建站教程:购买腾讯云服务器后手动搭建WordPress网站1(CentOS 7)...

在搭建WordPress网站之前&#xff0c;我们需要先部署LNMP环境&#xff0c;很简单&#xff0c;不会的直接复制粘贴&#xff0c;十几分钟就完成了。下面请跟着教程&#xff0c;一步一步来跟着我复制粘贴&#xff1a;实例配置举例&#xff1a;(建议购买4G内存以上的云服务器)CPU&a…

网站如何变成灰色的

网站如何变成灰色的&#xff1f;![在这里插入图片描述](https://img-blog.csdnimg.cn/3862cb7c9e41412e8c66a19157ad3637.png 参考&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter filter :CSS 属性将模糊或颜色偏移等图形效果应用于元素。滤镜通常用于…