• 关于项目中值对象Identifier的设计-领域驱动


    到现在为止做了不项目,发现每个实体都会有个相应的值对象。

    先简单说一下值对象和实体之间的区别:

    (以下内容来着《领域驱动设计》一书)

    当一个小孩画画的时候,他注意的是画笔的颜色和笔尖的粗细。但如果有两只颜色和粗细相同的画笔,他可能不会在意使用哪一支。如果有一支笔弄对了,他可以从一套新笔中拿出一支同颜色的笔来继续画画,根本不会在意已经换了一支笔。

    (暂时不写完整)

    以学生Student对象为例:

    public partial class Student:Entity<Student>
        {
            public Student(StudentIdentifier id):this()
            {
                Id = id;
            }
    
            public Student()
            {
            }
    
            /// <summary>
            /// 学号
            /// </summary>
            public virtual StudentIdentifier Id { get; protected set; }
            /// <summary>
            /// 姓名
            /// </summary>
            public virtual string Name { get; set; }
            /// <summary>
            /// 班级
            /// </summary>
            public virtual Classes Classes { get; set; }
        }

    其中virtual修饰是使用了NHibernate的原因。(重点不是这个)

    注意StudentIdentifier这个对象,也是这篇博客要讨论的。

    public struct StudentIdentifier : IBusinessIdentifier
        {
            public StudentIdentifier(string code)
                : this()
            {
                Code = code;
            }
    
            public string Code { get; private  set;}
    
            public static StudentIdentifier of(string code)
            {
                return new StudentIdentifier(code);
            }
    
            public override string ToString()
            {
                return string.Format("Student/{0}", Code);
            }
    
            public static implicit operator string(StudentIdentifier id)
            {
                return id.ToString();
            }
    
            public static implicit operator StudentIdentifier(string id)
            {
                var sub = id.Split(new[] {'/'}, 2);
                return StudentIdentifier.of(sub[1]);
            }
        }

    StudentIdentifier的设计在开发阶段有个很好的作用。

    如:我们页面和后台的传参一般就是传的Identifier类型,就像“Student/1”。

    后面的这个数字“1”作为Student实体的唯一标识。当程序员维护已经做出来的Web项目时,有时想知道某个点击事件传递参数是什么,得仔细看完后台代码才知道。

    有了这个设计后只需要把鼠标放在上面就能看到请求的URL后面所带的参数是属于那个实体的。

    当页面返回一个“Student/1”的string类型的参数时,因为写了隐式转换后台可以用StudentIdentifier类型的参数来接受,就可以当作StudentIdentifier值对象类型

    来用。

    这其实也是将隐式的概念显示化,比如在团队开发中经常要讨论的是,用哪个字段做某个实体的唯一标识。又或者某个实体的唯一标识的命名是什么。这些我想开发中经常会这么问。

    现在我们显示化了实体的唯一标识,那么你就不用再去问其他人某个实体的唯一标识是什么了。好处我也就不多说了。

  • 相关阅读:
    用nginx转发请求tomcat 如何配置访问日志获取真实ip
    jquery扩展方法(extend) 写法
    android binder机制
    rails nginx passenger postgre 在ubuntu部署
    ssh 免密码登陆
    佛山 开发者 程序员 ios 安卓 外包团队
    佛山程序猿交流群
    IOS开发 僵尸调试
    关于产品设计的功能
    android 视图(view)置顶
  • 原文地址:https://www.cnblogs.com/zuochengsi-9/p/5343031.html
Copyright © 2020-2023  润新知