架构模式逻辑层模式之:表模块(Table Model)

简介: 表模块和领域模型比,有两个显著区别: 1:表模块中的类和数据库表基本一一对应,而领域模型则无此要求; 2:表模块中的类的对象处理表中的所有记录,而领域模型的一个对象代表表中的一行记录; 一般情况下,我们可以基于第二点来严格区分你的设计是表模块的,还是领域模型的。

表模块和领域模型比,有两个显著区别:

1:表模块中的类和数据库表基本一一对应,而领域模型则无此要求;

2:表模块中的类的对象处理表中的所有记录,而领域模型的一个对象代表表中的一行记录;

一般情况下,我们可以基于第二点来严格区分你的设计是表模块的,还是领域模型的。如:如果我们有许多订单,则领域模型的每一个订单都有一个对象,而表模块只有一个对象来处理所有订单(注意,这里的类,都是指业务逻辑层的类,而不是实体类。表模块的类的对象和常规的领域模型的对象很类似,但是关键区别是:它没有标识符来标出它所代表的实体对象)。举例来说,如果要查询某个订单,表模块会像这样进行编码:

anOrderModule.GetOrder(string orderId);

因为表模块只有一个对象来处理所有订单,所以表模块可以是一个实例,也可以是一个只包含静态方法的静态类。

表模块 的代码和 事务脚本类似:

class TableModel
{
    protected DataTable table;
   
    protected TableModel(DataSet ds, string tableName)
    {
        table = ds.Tables[tableName];
    }
}

class Contract : TableModel
{
    public Contract(DataSet ds) : base (ds, "Contracts")
    {
    }
   
    public DataRow this[long id]
    {
        get
        {
            string filter = "ID=" + id;
            return table.Select(filter)[0];
        }
    }
   
    public void CalculateRecognitions(long contactId)
    {
        DataRow contractRow = this[contactId];
        double amount = (double)contractRow["amount"];
        RevenueRecognition rr = new RevenueRecognition(table.DataSet);
        Product prod = new Product(table.DataSet);
        long prodId = GetProductId(contactId);
       
        if(prod.GetProductType(prodId) == "W")
        {
            rr.Insert(contactId, amount, (DateTime)GetWhenSigned(contactId));
        }else if(prod.GetProductType(prodId) == "S")    // 电子表格类
        {
            // the sql "INSERT INTO REVENUECONGNITIONS (CONTRACT,AMOUNT,RECOGNIZEDON) VALUES (?,?,?)"
            DateTime dateSigned = (DateTime)GetWhenSigned(contactId);
            rr.Insert(contactId, amount / 3, dateSigned);
            rr.Insert(contactId, amount / 3, dateSigned.AddDays(60));
            rr.Insert(contactId, amount / 3, dateSigned.AddDays(90));
        }else if(prod.GetProductType(prodId) == "D")    // 数据库
        {   
            DateTime dateSigned = (DateTime)GetWhenSigned(contactId);
            rr.Insert(contactId, amount / 3, dateSigned);
            rr.Insert(contactId, amount / 3, dateSigned.AddDays(30));
            rr.Insert(contactId, amount / 3, dateSigned.AddDays(60));
        }
    }
   
    private long GetProductId(long contactId)
    {
        return (long)this[contactId]["ProductId"];
    }
   
    private DateTime GetWhenSigned(long contactId)
    {
        return (DateTime)this[contactId]["DateSigned"];
    }
}

class RevenueRecognition : TableModel
{
    public RevenueRecognition(DataSet ds) : base (ds, "RevenueRecognitions")
    {
    }
   
    public long Insert(long contactId, double amount, DateTime whenSigned)
    {
        DataRow newRow = table.NewRow();
        long id = GetNextId();
        newRow["Id"] = id;
        newRow["ContactId"] = contactId;
        newRow["Amount"] = amount;
        newRow["DateSigned"] = whenSigned;
        table.Rows.Add(newRow);
        return id;
    }
   
    // 得到哪天前入账了多少
    public double RecognizedRevenue(long contractNumber, DateTime asOf)
    {
        // the sql "SELECT AMOUNT FROM REVENUECONGNITIONS WHERE CONTRACT=? AND RECOGNIZEDON <=?";
        string filter = string.Format("ContactId={0} AND date <=#{1:d}", contractNumber, asOf);
        DataRow[] rows = table.Select(filter);
        double r = 0.0;
        foreach(DataRow dr in rows)
        {
            r += (double)dr["AMOUNT"];
        }
       
        return r;
    }
   
    private long GetNextId()
    {
        throw new Exception();
    }
}

class Product : TableModel
{
    public Product(DataSet ds) : base (ds, "Products")
    {
    }
   
    public DataRow this[long id]
    {
        get
        {
            string filter = "ID=" + id;
            return table.Select(filter)[0];
        }
    }
   
    public string GetProductType(long productId)
    {
        return (string)this[productId]["Type"];
    }
}

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
9月前
|
设计模式 存储 前端开发
MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的输入逻辑、业务逻辑和用户界面逻辑分离
【6月更文挑战第17天】**MVC模式**是软件设计模式,用于分离输入逻辑、业务逻辑和用户界面。模型处理数据和业务,视图展示数据,控制器协调两者响应用户请求。优点包括:关注点分离、提高开发效率、简化测试、支持多视图及便于大型项目管理。
78 3
|
6月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
7月前
|
安全 Java
建模底层逻辑问题之在建模过程中,知识层和操作层如何区分
建模底层逻辑问题之在建模过程中,知识层和操作层如何区分
|
前端开发 API 数据库
fastadmin框架调用model层的方法
fastadmin框架调用model层的方法
352 0
|
Oracle Java 关系型数据库
hibernate在分层架构中修改数据(update)时遇到的问题!!
hibernate在分层架构中修改数据(update)时遇到的问题!!
|
SQL Java 数据库连接
数据层设计与开发(数据层标准实现类) | 学习笔记
简介:快速学习数据层设计与开发(数据层标准实现类)
162 0
数据层设计与开发(数据层标准实现类) | 学习笔记
|
数据库 开发者
数据层设计与开发(定义数据层标准) | 学习笔记
简介:快速学习数据层设计与开发(定义数据层标准)
214 0
数据层设计与开发(定义数据层标准) | 学习笔记
|
开发者
OR-Mapping 设计改进(数据层结构调整) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(数据层结构调整)
模型和视图分离原则
模型和视图分离原则
676 0
|
前端开发 .NET 数据库
一起谈.NET技术,使用View Model从表现层分离领域模型
MVC架构模式是近年来编程世界里最长被提及的模式之一,Model-View-Controller(模型-视图-控制器,MVC) 模式将你的软件组织并分解成三个截然不同的角色: Model 封装了你的应用数据、应用流程和业务逻辑。
995 0

热门文章

最新文章