架构模式对象与关系结构模式之:标识域(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 ID=@Id
        SELECT * FROM [EL_Organization].[USER] WHERE ID=@Id
        SELECT * FROM [EL_Organization].[ORGANIZATION] WHERE ID=@ORGID
        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;
    }
}

代码不再多议。


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/p/3735335.html,如需转载请自行联系原作者

相关文章
|
11天前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
25天前
|
编解码 人工智能 文件存储
卷积神经网络架构:EfficientNet结构的特点
EfficientNet是一种高效的卷积神经网络架构,它通过系统化的方法来提升模型的性能和效率。
26 1
|
1月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
72 3
|
2月前
|
分布式计算 负载均衡 API
微服务架构设计原则与模式
【8月更文第29天】随着云计算和分布式计算的发展,微服务架构已成为构建大型复杂应用的一种流行方式。这种架构模式将单个应用程序分解成一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。本文将探讨微服务架构的基本设计原则、常用模式以及如何有效地划分服务边界。
147 3
|
2月前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
70 6
|
2月前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
2月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
61 0
|
2月前
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
57 0
|
2月前
|
设计模式 测试技术 数据处理
|
2月前
|
负载均衡 监控 JavaScript
探索微服务架构下的API网关模式
【8月更文挑战第31天】在微服务的大潮中,API网关不仅是流量的守门人,更是服务间通信的桥梁。本文将带你深入理解API网关的核心概念、设计要点及其在微服务架构中的重要作用,同时通过代码示例揭示如何利用API网关提升系统的灵活性与扩展性。
下一篇
无影云桌面