.NET三层经典架构PetShop3.0分析---1

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: petshop是C#实现的petstore,具体和技术无关的情况就不多介绍了。petshop3.0比petshop1和2都有了较大的改变,主要是设计方面的。看一下里面的8个工程和1个站点就知道它肯定分了不少层。

petshop是C#实现的petstore,具体和技术无关的情况就不多介绍了。
petshop3.0比petshop1和2都有了较大的改变,主要是设计方面的。看一下里面的8个工程和1个站点就知道它肯定分了不少层。
一.概况介绍。
Model:
模型层,封装业务实体,一般和数据库模式对应。
例如:
       public class AccountInfo {
 
              // Internal member variables
              private string _userId;
              private string _password;
              private string _email;
              private AddressInfo _address;
              private string _language;
              private string _category;
              private bool _showFavorites;
              private bool _showBanners;
              。。。
       }
IDAL:
数据访问接口层,主要是一些dao接口。
例如:
       public interface IAccount
       {
              AccountInfo SignIn(string userId, string password);
              AddressInfo GetAddress(string userId);
              void Insert(AccountInfo account);
              void Update(AccountInfo Account);
       }
 
OracleDAL:
oracle实现的数据访问层。
 
SQLServerDAL:
sql实现的数据访问层。
OracleDAL和SQLServerDAL中的类都实现了IDAL中的接口。属于dao实现。
 
DALFactory
负责确定是使用oracle实现还是mssql实现。通过在web.config中的配置确定使用哪一个dal实现(通过反射,动态生成访问类是PetShop.SQLServerDAL还是PetShop.OracleDAL命名空间中的类)。
              <add key="WebDAL" value="PetShop.SQLServerDAL"/>
              <add key="OrdersDAL" value="PetShop.SQLServerDAL"/>
       public class Account
       {
              public static PetShop.IDAL.IAccount Create()
              {                  
                     /// Look up the DAL implementation we should be using
                     string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];
                     string className = path + ".Account";
 
                     // Using the evidence given in the config file load the appropriate assembly and class
                     return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);
              }
       }
 
BLL:
业务访问层。通过DALFactory,读取配置,决定使用何种dal实现。
       public class Account {         
              public AccountInfo SignIn(string userId, string password) {
 
 
                     if ((userId.Trim() == string.Empty) || (password.Trim() == string.Empty))
                            return null;
 
                     // 通过DALFactory调用具体的dal实现。
                     IAccount dal = PetShop.DALFactory.Account.Create();
 
                     // Try to sign in with the given credentials
                     AccountInfo account = dal.SignIn(userId, password);
 
                     // Return the account
                     return account;
              }
              。。。
}
 
Web:
表现层,主要包括了Web 页面(aspx)和用户控件(ascx)控件及自定义服务器控件SimplePager和ViewStatePager。
 
Utility:
公用模块,一组帮助器类,其他业务层和数据访问层可能会使用到的一些公用方法。
 
 
 
 
分层如何使系统更灵活
       学习面向对象设计和设计模式和架构模式,我们可以知道,设计的重要目的,一个是可重用,一个是可维护还有就是可扩展性。
       面向对象技术本身就提供了很多可重用得机制,通过继承和组合可以使代码较大程度的重用。另外,我们需要通过设计,抽象出基本的概念,对这些概念进行重用。重用可以提高系统的可维护性,因为重用的东西一般经过了充分的测试和长时间的考验,比我们自己重复发明的轮子的质量更容易保证。
可扩展,继承和重载是扩展的方式,但他们是语言级的,我们需要通过设计达到系统级的可扩展。
这里主要结合petshop的分层设计和实现谈一下这几个设计的指标。
       上面介绍了各个层,各层的调用关系是这样的:
web层-->BLL(使用Model)-->DALFactory(通过IDAL)-->具体DAL实现层(oracle或ms sql)-->持久存储。
       这样,各层至于相邻的层交互,通过定义良好的接口,层内部的实现对其他层来说关系是不大的。这很符合软件工程的思想,因为定义好了接口后,开发人员就可以按照自己的特长实现各自的层,并且容易测试,因此可以提高软件的开发效率和开发质量。
从架构和源码实现上我们可以看到,数据层的灵活性,可扩展性和可维护性是通过DALFactory层实现的。我们知道,由于采用面向接口编程这一原则,DALFactory可以通过配置文件信息来确定使用哪一个IDAL实现,这样我们就可以在部署时通过修改配置文件来适应客户的数据库要求。当然这也要求,具体的数据库实现层要遵循特定的命名约定,比如对于Account实现,sql和oracle中对应的类要有相同的名字和构造函数(现在是必须有默认构造函数,否则无法初始化),当然所在的名称空间要不同。
以后,当我们需要实现mysql或db2的数据实现层的时候,我们只需要通过mysql或db2按照上面的命名约定实现,在web.config文件中进行配置就可以了(可扩展和可维护性)。而且,如果客户原先使用mssql后来要使用oracle,然后…… 如此反复的折腾,我们也不会挠头,因为我们原先的实现可重用,新的要求,可扩展。另一方面,对于同一个数据库我们也可以采用不同的实现方法,比如ado.net(又分为直接的sql和存储过程实现),orm框架,ibati式的半orm框架,我们可以为每种这样的实现建立一个工程,灵活的选择,而不是仅在原来的基础上修改。这就是petshop数据访问层向我们展示的为什么要这么分层。
       其实现在的很多框架和系统为了实现灵活性都是通过配置实现的,因为修改配置
不像修改源代码那样需要重新发布,而且就像petshop,OracleDAL,SQLServerDAL的两个dll可以同时存在,需要使用哪一个就配置哪一个就可以了。

目录
相关文章
|
3月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
9天前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
|
7天前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
5月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
1月前
|
存储 前端开发 JavaScript
如何开发设备管理系统中的经验分析报表板块 ?(附架构图+流程图+代码参考)
设备管理系统(EMS)助力企业高效管理设备生命周期,涵盖采购、维护到报废全流程。本文详解经验分析报表模块设计与开发,涵盖动态看板、点检、巡检、维修、保养及库存统计功能,提供代码示例与架构设计建议,提升设备管理效率与决策水平。
|
4月前
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
278 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
3月前
|
运维 监控 数据可视化
一文详解:工业软件“低代码开发平台”技术架构研究与分析
本文围绕工业软件低代码开发平台的机遇与挑战,提出基于自动化引擎的技术架构,由工具链、引擎库、模型库、组件库、工业数据网关和应用门户组成。文章分析了其在快速开发、传统系统升级中的应用模式及价值,如缩短创新周期、降低试错成本、解决资源缺乏和提升创新可复制性,为我国工业软件产业发展提供参考和支持。
|
3月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
487 0
|
7月前
|
SQL 运维 BI
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
浙江霖梓早期基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris + Paimon 的实时/离线一体化湖仓架构,实现查询提速 30 倍、资源成本节省 67% 等显著成效。
356 3
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
|
6月前
|
前端开发 JavaScript API
体育赛事即时比分 分析页面的开发技术架构与实现细节
本文基于“体育即时比分系统”开发经验总结,分享技术实现细节。系统通过后端(ThinkPHP)、前端(Vue.js)、移动端(Android/iOS)协同工作,解决实时比分更新、赔率同步及赛事分析展示等问题。前端采用 Vue.js 结合 WebSocket 实现数据推送,提升用户体验;后端提供 API 支持比赛数据调用;移动端分别使用 Java 和 Objective-C 实现跨平台功能。代码示例涵盖比赛分析页面、API 接口及移动端数据加载逻辑,为同类项目开发提供参考。