架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)

简介:

一:表数据入口(Table Data Gateway)

表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类。其它代码通过它来实现对数据库的交互。基于这个特点,表数据入口和事务脚本代码以及表模块结合的很好。

在查询时候,表数据接口可以返回数据集 或者 DTO 或者 DTO列表。在 事务脚本 代码中已经阐述过了 DTO 以及 DTO 的列表这种形式。但是使用 DTO 这种形式,带来的一个问题是:到处衍生的 DTO,那么,如何减少到处衍生的 DTO 的,见这里《》。

在传统做法中,表数据入口和领域模型不一起使用,使用领域模型,一般使用数据映射器。

表数据入口的代码到处都是,如:

    public class UserDal : SqlServerDal<User> 
    { 
        public override IList<User> GetList() 
        { 
            string sql = "select * from [EL_Organization].[User] where state=1"; 
            var ds = SqlHelper.ExecuteDataset(CommandType.Text, sql);

            IList<User> oblist = new List<User>(); 
            foreach (DataRow row in ds.Tables[0].Rows) 
            { 
                oblist.Add(new User{ Id = (string)row["Id"], Name = (string)row["Name"] }); 
            }

            return oblist; 
        } 
        
        public override User FindOne(User t){ return null;} 
    
        public override void Insert(User model) {} 
        
        public override void Update(User t){}

        public override void Delete(User t){} 
    }

    public class User 
    { 
        public string Id; 
        public string Name; 
    }

 

二:行数据入口(Row Data Gateway)

行数据入口,则表中的一行记录存在一个对象。

    public class UserDal 
    { 
        public string Id; 
        public string Name; 
        
        public void Load(DataSet ds) 
        { 
            //根据 ds 得到自身,而这个 ds 有可能是从 UserFinderDal 得到的 
        } 
        
        public void Insert() 
        { 
            string sql = @"INSERT INTO [EL_Organization].[User] ('Id', 'Name') VALUES (" + this.Id + "," + this.Name + ")"; 
            var ds = SqlHelper.Execute(CommandType.Text, sql); 
        } 
        
        public void Update() 
        { 
            // update this; 
        }

        public void Delete() 
        { 
            // delete this; 
        } 
    }

    public class UserFinderDal 
    { 
        public UserDal FindOne(string id) 
        { 
            string sql = "select * from [EL_Organization].[User] where id=" + id; 
            var ds = SqlHelper.ExecuteDataset(CommandType.Text, sql);

            foreach (DataRow row in ds.Tables[0].Rows) 
            { 
                return new UserDal {Id = (string)row["Id"], Name = (string)row["Name"]}; ; 
            } 
            
            return null; 
        } 
    
        public List<UserDal> FindList(string name) 
        { 
            return null; 
        } 
    
    }

可以看到,和表数据库入口比,查询数据库中的数据,表数据库入口只要一个类就可以了,而行数据入口则需要两个类,自身也被用做数据库实体,但是负责自身的 update insert delete,而要查询自身和集合或者是操作集合,则需要另外一个类来完成。

 

二:活动记录(Active Record)

活动记录 与 行数据入口 很类似。二者的差别是 行数据入口 只有数据库访问而 活动记录 是即有数据库访问又有领域逻辑。在 行数据入口 中,我们一般使用两个类,而在活动记录中,一般则无此限制,通常情况下,一个类可能会显得更清爽。

领域模型,一般和 活动记录 或者 数据映射器 协作。

在软件开发中,初级的做法是:事务脚本;

比较高级一点的做法是:活动记录。一般,当发现事务脚本的代码已经复杂到难以维护的时候,则可以逐步创建活动记录,然后慢慢为它们添加行为,即:把表包装成为活动记录,然后添加领域逻辑。

最复杂而高级的做法是:领域模型。

从以上的描述中,我们很容易知道如何修改本文中的 表数据入口 或者 行数据入口 的代码,继而让它成为 活动记录 的。

    public class UserActiveRecord 
    { 
        public string Id; 
        public string Name; 
        
        public void Load(DataSet ds) 
        { 
            //根据 ds 得到自身,而这个 ds 有可能是从 UserFinderDal 得到的 
        } 
        
        public void Insert() 
        { 
            string sql = @"INSERT INTO [EL_Organization].[User] ('Id', 'Name') VALUES (" + this.Id + "," + this.Name + ")"; 
            var ds = SqlHelper.Execute(CommandType.Text, sql); 
        } 
        
        public void Update() 
        { 
            // update this; 
        }

        public void Delete() 
        { 
            // delete this; 
        } 
        
        public UserActiveRecord FindOne(string id) 
        { 
            string sql = "select * from [EL_Organization].[User] where id=" + id; 
            var ds = SqlHelper.ExecuteDataset(CommandType.Text, sql);

            foreach (DataRow row in ds.Tables[0].Rows) 
            { 
                return new UserActiveRecord {Id = (string)row["Id"], Name = (string)row["Name"]}; ; 
            } 
            
            return null; 
        } 
    
        public List<UserActiveRecord> FindList(string name) 
        { 
            return null; 
        } 
        
        public void SomeOtherLogic() 
        { 
        } 
    }

从上面的代码来看,活动记录这种模式不在 业务逻辑层 和 数据访问层,因为它们是一体的。而事务脚本 或者 表数据入口 和 行数据入口,多多少少可以存在两层的概念。

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/p/3734225.html,如需转载请自行联系原作者
相关文章
|
26天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
177 6
|
2月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
75 2
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
71 2
|
2月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
97 2
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
47 3
|
1月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
48 2
|
3月前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
4月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
108 0
|
4月前
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
201 0