架构模式对象与关系结构模式之:标识域(Identity Field)

一:标识域(Identity Field)

标识域(Identity Field)可以理解为主键。使用领域模型和行数据入口的时候,就要使用标识域,因为这两个对象代表的是唯一存在的那个数据记录。事务脚本、表模块、表数据入口等就不需要这个映射。

public abstract class DomainObj
{
    public string Id {get; set;}

public string Name {get; set;}
    protected UnitOfWork uow = new UnitOfWork();
    protected void MakeNew()
    {
        uow.RegisterNew(this);
    }
    protected void MakeDirty()
    {
        uow.RegisterDirty(this);
    }
    protected void MakeRemoved()
    {
        uow.RegisterRemoved(this);
    }
}

二:外键映射(Foreign Key Mapping)

所谓 外键映射 就是在获取对象的时候,把对象中的属性对象的值也获取到。我们在 延迟加载 中,使用的就是这一技术。这是 UserMap 中的一段代码,显示了如何将 组织 和 用户 以及用户所在的班级集合(一个用户可能存在于多个班级中) 一起进行获取到:

public override User AbstractFind(string id)
{
    var user = base.AbstractFind(id);
    if( user == null )
    {
        //
        string sql = @"
        DECLARE @ORGID VARCHAR(32)=‘‘, @TRAINNINGS VARCHAR(MAX)=‘‘;
        SELECT @ORGID=OrganizationId,@TRAINNINGS=TrainingIds FROM [EL_Organization].[USER] WHERE [email protected]
        SELECT * FROM [EL_Organization].[USER] WHERE [email protected]
        SELECT * FROM [EL_Organization].[ORGANIZATION] WHERE [email protected]
        SELECT * FROM [EL_Organization].[Training] WHERE CHARINDEX(ID + ‘,‘, @TRAINNINGS + ‘,‘) > 0";
        var pms = new SqlParameter[]
        {
            new SqlParameter("@Id", id)
        };
        var ds = SqlHelper.ExecuteDataset(CommandType.Text, sql, pms);
        user = DataTableHelper.ToList<User>(ds.Tables[0]).FirstOrDefault();
        user.Organization =  DataTableHelper.ToList<Organization>(ds.Tables[1]).FirstOrDefault();
        user.Trainnings =  DataTableHelper.ToList<Trainning>(ds.Tables[2]).ToList();
        if(user == null)
        {
            return null;
        }

user = Load(user);
        // 注意,除了 Load User 还需要 Load Organization
        user.Organization = Load(user.Organization) as Organization;
        foreach(var t in user.Trainnings)
        {
            Load(t);
        }
        return user;
    }
    return user;
}

三:依赖映射(Dependent Mapping)

依赖映射的表现形式就是:依赖着本身没有数据映射器,其所有操作数据库的行为都发生在所有者中间。

依赖者没有标识域(当然,这并不意味着数据库中它就一定没有主键)。依赖者与值对象很像,或者说,从 C# 的语法的角度而言,它们没有区别。

四:嵌入值(Embedded Value)

指领域模型中用到的那些小对象,它们对数据库没有意义,对领域对象却有意义。

五:升级版的标识映射

如果表示映射不是仅仅一个字段该怎么办,我们需要考虑多个字段,下面是一个标识映射的升级版本,查看:

public class Key : IEquatable<Key>
{
    private object[] fields;

private string domainType;

public Key(string id, Type type)
        : this(new[] { id }, type.ToString())
    {

}

public Key(object[] fields, string domainType)
    {
        if (string.IsNullOrEmpty(domainType))
            throw new ArgumentNullException("domainType can not be null");

CheckKeyNotNull(fields);
        this.fields = fields;
        this.domainType = domainType;
    }

private void CheckKeyNotNull(object[] fields)
    {
        if (fields == null)
        {
            throw new ArgumentNullException("Can not have a null key");
        }

foreach (var field in fields)
        {
            if (field == null)
            {
                throw new ArgumentNullException("Can not have a null element of key");
            }
        }
    }

private void CheckSingleKey()
    {
        if (fields.Length > 1)
        {
            throw new ArgumentException("Can not take value on composite key");
        }
    }

public string GetId()
    {
        CheckSingleKey();
        return fields[0].ToString();
    }

public override bool Equals(object obj)
    {
        if (obj == null) return false;
        if (object.ReferenceEquals(this, obj)) return true;
        if (this.GetType() != obj.GetType()) return false;
        return Equals(obj as Key);
    }

public bool Equals(Key other)
    {
        if (this.fields.Length != other.fields.Length)
        {
            return false;
        }

for (int i = 0; i < fields.Length; i++)
        {
            if (!fields[i].Equals(other.fields[i]))
            {
                return false;
            }
        }

if (this.domainType != other.domainType)
        {
            return false;
        }

return true;
    }

public override int GetHashCode()
    {
        int hash = 0;

for (int i = 0; i < fields.Length; i++)
        {
            hash += fields[i].GetHashCode();
        }

hash += this.domainType.GetHashCode();
        return hash;
    }
}

代码不再多议。

架构模式对象与关系结构模式之:标识域(Identity Field)

时间: 2024-07-31 19:33:18

架构模式对象与关系结构模式之:标识域(Identity Field)的相关文章

[JAVA设计模式]第三部分:结构模式

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任! 结构模式... 52 适配(Adapter)器模式... 52 类适配器模式结构... 52 对象适配器结构... 53 从Iterator到Enumeration的适配... 54 从Enumeration到Iterator的适配... 54 缺省适配(Default Adapter)器模式... 55 模式结构... 56 与适配器模式区别... 56 J2EE中的缺省适配模式... 5

设计模式大类--结构模式(上)

大概有7中结构模式,分为上下两篇.一.Adapter(适配器)描述:将两个不兼容的类结合一起使用,一般需要用到其中某个类的若干方法好处:在两个类直接创建一个混合接口,而不必修改类里面的其他代码 例子:假设我们要打桩,有两种类:方形桩 圆形桩.public class SquarePeg{ public void insert(String str){ System.out.println("SquarePeg insert():"+str); } } public class Roun

中介者模式-对象行为型

原理 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式又称为调停者模式. 1)迪米特法则的一个典型应用:在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代.因此,中介者模式就是迪米特法则的一个典型应用.2) 通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,中介者承担了中转

状态模式-对象行为型

原理 允许一个对象在其内部状态改变时改变它的行为.这个对象看起来似乎修改了它的类. 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行.每一种状态改变,都有可能要根据其他状态来更新处理.例如,开门状体,你不能在运行的时

php设计模式(二):结构模式

上一篇我们介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,现在我们继续来给大家介绍结构型模式.一.什么是结构型模式? 结构型模式是解析类和对象的内部结构和外部组合,通过优化程序结构解决模块之间的耦合问题. 二.结构型模式的种类:    适配器模式    桥接模式    装饰模式    组合模式    外观模式    享元模式    代理模式 1. 适配器模式(Adapter) 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本的由于接口不兼容而不能

Design Model 之 结构模式

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,我们看下面的图: 6.适配器模式 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式. 01.类的适配器模式 核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Ta

创建模式、结构模式和行为模式在软件开发中解决的事情

创建模式 创建型模式,就是创建对象的模式,抽象了实例化的过程. 它帮助一个系统独立于如何创建.组合和表示它的那些对象. 关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑 结构模式 结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的. 结构型模式包容了对很多问题的解决.例如:扩展性(外观.组成.代理.装饰)封装性(适配器,桥接). 行为模式 行为型模式涉

架构_10 个常用的软件架构模式

你是否曾经思考过如何设计大型的企业级系统?在决定启动软件开发之前,首要的是选择恰当的架构来指引系统的功能及质量属性设计.因此在将软件架构应用于设计之前,必需要了解常用的架构模式. 什么是架构模式? Wikipedia 的解释: 在软件架构中,架构模式是对特定环境下常见问题的通用且可重用的解决方案.架构模式与软件设计模式很相似,但架构模式的层次更高,且外延更大. 这篇文章将简述常见的 10 种架构模式的概念.用法以及其优缺点. 分层模式(Layered pattern) 客户端/服务器模式(Cli

微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed架构,也就是推拉模式(timyang上次也分享了新浪微薄的模式).下面我们就微博的feed推拉(push,pull)模式做一下探讨,并提出新的时间分区拉模式. 众所周知,在微博中,当你发表一篇微博,那么所有关注你的followers(粉丝)都会在一定的时间内收到你的微薄,这有点像群发一封邮件,所有的