一起谈.NET技术,.NET 分布式架构开发实战之三 数据访问深入一点的思考

简介:   前言:  首先,感谢朋友们对文章的支持,感谢大家,希望本系列的文章能够真正的对大家起到一点帮助的作用。再次感谢大家。  大家也许想问,什么时候出代码,代码一定会出的,我不想一上来就开始抛出一大堆的代码,然后讲解,架构的设计在思考的过程,思考到了,代码也就水到渠成了。

  前言:

  首先,感谢朋友们对文章的支持,感谢大家,希望本系列的文章能够真正的对大家起到一点帮助的作用。再次感谢大家。

  大家也许想问,什么时候出代码,代码一定会出的,我不想一上来就开始抛出一大堆的代码,然后讲解,架构的设计在思考的过程,思考到了,代码也就水到渠成了。

  上篇文章讲述在设计之初,Richard所画出的一些草图,本篇对之前的草图做了进一步的思考。

  本篇的议题如下:

  1、草图的一些问题在哪里

  2、重审之前项目中数据层的问题

  3、思维的一点突破

  4、回首再看数据访问层

  1.草图的一些问题在哪里

  当Richard把草图画出来了之后,想到了另外的一个问题:在DAL数据层之间提供的那个接口层到底应不应该是Services Interface。其实这个接口层是普通的Interface层还是Services Interface,Richard也拿不定主意的,因为当初之所以要把这个接口层改为Services Interface,是因为在数据源提供者(Service Agent)那块给了他灵感数据源可以使用远程的Services。基于这个思想,所以Richard也考虑到了:

  也许,现在设计的这个DAL,哪一天会作为服务给其他的程序提供数据也不说定。

  虽然,这个问题对现在来说不是那么的重要,但是在Richard的心里,无法说服自己到底使用哪一种接口层(也许是Richard这个人的性格有关吧,一定要给个理由说服自己,但是这个理由又不能随随便便的糊弄自己)。

  Richard想到了之前在开发项目的时候,也确实曾经把其他公司提供的服务作为数据源的情况。当时的调用虽然只是进行查询,增加,删除,修改的简单操作,但是很多的流程已经在服务提供者那边定义好了,例如在发送一批货物的时候,Richard只是调用了服务接口的一个CreateProduct(Product product)方法,但是在服务器那端却做了很多的事情:计算库存,生成订单,选择货物供应商等等。这样说来,如果现在Richard把DAL上面加上一个Services Interface层,那么DAL或者其他的层就必须提供很多的逻辑操作,或者不一定是逻辑操作,还可以是数据格式验证、身份验证。

  如果真的这样设计,那么数据层的做的事情就很多了,要很多的逻辑。而这些逻辑在BLL中进行才是比较好的选择,想到这里,Richard似乎开始明白:把Services Interface层放在BLL层之上。这样就可以充分的利用BLL的逻辑验证功能。所以DAL之上的接口层,还是决定采用普通的接口。

  2.重审之前项目中数据层的问题

  Richard在数据层DAL这块花了大量时间来思考,其实是有原因的。在之前的项目中,数据层的设计显得很臃肿,而且在Richard看来,这些代码已经可以用一种比较通用的方式来写,没有必要写那么复杂的代码。

  例如,在EmployeeDAL中有以下的方法:

  代码

 
 
public Employee GetEmployeeById( string employeeId);
public Emplpyee GetEmployeeByName( string employeName);
public string GetEmployeePositionById( string employeeId);
public int GetEmployeeCount();

  这样写,没有错。但是有一点引起了Richard的思考:DAL类中,很多的方法基本上都是查询的方法,而Add, Update, Delete在很多的DAL类中形式都比较的统一,特别是在使用了Linq, Entity Framework之后,所有的数据实体类Add,Update, Delete方法几乎是一样的,如在Linq中可以使用DataContext.GetTableT().InsertOnSubmit(entity)方法来插入任何的数据实体类。

  但是就只有这些不同条件的查询方法很难统一,几乎是每个不同的DAL都要去实现自己的一些特有的查询方法。但是Richard认为把这些方法统一是有可能的,甚至是达到那种以不变应万变的效果才好,带着这个想法Richard开始进行很多的尝试。

  3. 思维的一点突破

  Richard极力的在自己的脑海搜寻解决的方案,也翻阅自己之前下载和买过的书籍,看看那些是否与查询数据有关,只要看到有查询两个字的章节,Richard就不会放过。也参看了.NET的一个知名开源Framework 的设计思想。

  给了他提示的就是Fowler企业应用架构模式一书,书中提到的查询对象(Query Object), Richard参看了之后第一反应就是:确实不错,但是太抽象了,没有给出一些示例。

  其实之前Richard在看这本书的时候,认为书的高度太高了,Richard几次攻读,都是深受打击。所以,结果是Richard很敬畏这本书,但是还是想有朝一日能够拿下它。现在书中就有了查询对象的一些解决方案和实现,Richard硬着上了。

  Richard认为:很多的事情不是等你的所有条件都具备才去做的,事情往往是在你还没有准备好的情况下就已经发生了,凡事都有一个开头,做架构也是这样的,开始设计一个架构的时候,并且不是说明你已经完全的把所有技术都掌握了,完美了,肯定是有一个开始尝试的过程。可能在开始设计的时候,漏洞百出,但是思维的周密性也是这样慢慢的锻炼出来的。

  平时在思考的时候,自己站在一个高一点的角度看问题(现在是开发人员,但是开发人员在设计和开发的时候可以这样想:如果我是架构的设计者,我会怎么做?),思维的高度上去了,机会到来的时候也就从容了。

  Richard开始重新理解查询对象。其实查询对象就是在一定程度上隐藏了SQL语句,查询对象是解释器模式的一种应用,实际上查询对象最后还是要解释为SQL语句到数据库中去执行的(不管在中间过程是如何一步步的操作这个查询对象,因为数据库现在只是认识SQL,所以查询对象最终还是要生成SQL语句)。

  查询对象主要用途就是使得客户程序可以构造各种的查询,而且查询中使用的都是与业务类有关的属性,这就意味着,客户程序不用了解数据库的表名和列名。这种做法最直接的好处就是业务开发的人员不用知道数据库的构造。

  而且如果查询对象的设计是以接口的形式出现,那么灵活性就更加的大。例如,设计一个IQuery的查询对象接口,然后,在架构中有两个实现了IQuery接口的查询对象,如LinqQuery, EFQuery,这两个具体的查询对象最终会被分别解释为Linq和Entity Framework可以识别的语句,再通过Linq和Entity Framework去执行数据操作。在程序中就可以通过配置来决定使用哪种查询对象和使用哪种数据访问技术。

  越来越多的想法在Richard的脑海中出现,而随之带来的问题也开始堆积。基本的思想是有了,但是实现起来那就得是另外的一回事了。怎么把这些思绪理清,怎么把这些理清的思绪变为代码的实现,这个成为了摆在Richard面前最现实的难题。

  但是不管怎样,已经有了一点点的进展,记得当初考虑的时候还是头脑一片空白,现在的想法一个接着一个,在思维上进步了。Richard觉得有点欣慰。

  4.回首再看数据访问层

  有了上面的思考,Richard再次审视了DAL,开始发觉:DAL其实就只是一个存取数据和操作数据的地方,这就是DAL的主要功能。现在数据层的设计基本上已经可以实现了,而且可以做到以不变应万变,不管BLL中对数据进行什么样的操作,在DAL层都可以用那个四种增,删,查,改的方法搞定。

  相关文章:.NET分布式架构开发实战之一 故事起源

                     .NET 分布式架构开发实战之二 草稿设计

                    .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

目录
相关文章
|
7天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
20天前
|
Java 持续交付 微服务
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过具体案例分析,揭示了其如何助力企业应对业务复杂性、提升系统可维护性和可扩展性。文章首先概述了微服务的核心概念及其优势,随后详细阐述了实施微服务过程中的关键技术选型、服务拆分策略、容错机制以及持续集成/持续部署(CI/CD)的最佳实践。最后,通过一个真实世界的应用实例,展示了微服务架构在实际项目中的成功应用及其带来的显著成效。 ####
|
1天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
3天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
3天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
22 2
|
13天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
13天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
34 1
|
19天前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
19 7
|
16天前
|
运维 监控 API
后端开发中的微服务架构实践与挑战####
【10月更文挑战第19天】 本文将深入浅出地探讨微服务架构在后端开发中的应用,通过实例解析其核心理念、优势所在,以及实施过程中可能遭遇的挑战与应对策略。不同于传统单体应用,微服务以其轻量级、灵活性和可扩展性受到青睐,但同时也带来了服务间的通信复杂性、数据一致性等问题。通过本篇文章,读者将对微服务架构有一个全面而深入的理解,为实际项目中的选型与实施提供参考。 ####
|
20天前
|
负载均衡 监控 API
后端开发中的微服务架构实践
【10月更文挑战第15天】 在当今的软件开发领域,微服务架构已成为一种流行的技术趋势。本文将探讨微服务架构的基本概念、优势以及在实际后端开发中的应用。我们将通过具体案例分析,了解如何设计和实现一个高效的微服务系统,以及如何应对在实施过程中可能遇到的挑战。
34 1
下一篇
无影云桌面