CodeArt入门教程(四)

6. 为领域模型编码

  现在我们为账户子系统(AccountSubsystem)设计领域对象并编码实现细节。

  账号、角色、权限是账户子系统里已知的3个事物,而一个子系统里面可以有多个内聚模型,所以我们首先要思考的问题是:以谁为聚合根创建第一个内聚模型?

  与如何划分子系统的思路一样,我们以最简单、最独立的事物作为突破口。简单是指事物在特定领域里的特征比较少,没有那么复杂。很明显,权限是最简单、最独立的,它不依赖于账号、角色而独立存在,而且从目前收集到的需求来看,权限的特征只需要有名称即可。所以我们尝试以权限(Permission)为聚合根创建第一个内聚模型。请各位注意,我在这里用“尝试”一词表达要做的工作,因为我们并不能保证当前做的决策100%是对的,但是勇敢的去尝试总比畏首畏尾、不敢迈出第一个步子、始终原地踏步要好的多。所以各位在实践的时候,如果有了灵感、有了大致的思路,就算思路还不够全面、不够清晰,你也可以大胆的去尝试,CA可以保证即便设计有误也能及时修正。使用CA开发项目的过程就是不断的在分析、设计、实践、修正中反复迭代的过程,最终你会提炼出与事物本质特征相符的领域模型。

  Permission的代码和详细说明如下:

  1 using System;
  2
  3 using CodeArt.DomainDriven;
  4
  5 namespace AccountSubsystem
  6 {
  7     /// <summary>
  8     /// 权限对象
  9     /// </summary>
 10     [ObjectRepository(typeof(IPermissionRepository))]
 11     [ObjectValidator(typeof(PermissionSpecification))]
 12     public class Permission : AggregateRoot<Permission, Guid>
 13     {
 14         internal static readonly DomainProperty NameProperty = DomainProperty.Register<string, Permission>("Name");
 15
 16         /// <summary>
 17         /// 权限名称
 18         /// </summary>
 19         [PropertyRepository()]
 20         [NotEmpty()]
 21         [StringLength(2, 25)]
 22         public string Name
 23         {
 24             get
 25             {
 26                 return GetValue<string>(NameProperty);
 27             }
 28             set
 29             {
 30                 SetValue(NameProperty, value);
 31             }
 32         }
 33
 34
 35         internal static readonly DomainProperty MarkedCodeProperty = DomainProperty.Register<string, Permission>("MarkedCode");
 36
 37
 38         /// <summary>
 39         /// <para>权限的唯一标示,可以由用户设置</para>
 40         /// <para>可以通过唯一标示找到权限对象</para>
 41         /// <para>该属性可以为空</para>
 42         /// </summary>
 43         [PropertyRepository()]
 44         [StringLength(0, 50)]
 45         public string MarkedCode
 46         {
 47             get
 48             {
 49                 return GetValue<string>(MarkedCodeProperty);
 50             }
 51             set
 52             {
 53                 SetValue(MarkedCodeProperty, value);
 54             }
 55         }
 56
 57         /// <summary>
 58         /// 是否定义了标识码
 59         /// </summary>
 60         public bool DeclareMarkedCode
 61         {
 62             get
 63             {
 64                 return !string.IsNullOrEmpty(this.MarkedCode);
 65             }
 66         }
 67
 68
 69         private static readonly DomainProperty DescriptionProperty = DomainProperty.Register<string, Permission>("Description");
 70
 71         /// <summary>
 72         /// <para>描述</para>
 73         /// </summary>
 74         [PropertyRepository()]
 75         [StringLength(0, 200)]
 76         public string Description
 77         {
 78             get
 79             {
 80                 return GetValue<string>(DescriptionProperty);
 81             }
 82             set
 83             {
 84                 SetValue(DescriptionProperty, value);
 85             }
 86         }
 87
 88         [ConstructorRepository()]
 89         public Permission(Guid id)
 90             : base(id)
 91         {
 92             this.OnConstructed();
 93         }
 94
 95         #region 空对象
 96
 97         private class PermissionEmpty : Permission
 98         {
 99             public PermissionEmpty()
100                 : base(Guid.Empty)
101             {
102                 this.OnConstructed();
103             }
104
105             public override bool IsEmpty()
106             {
107                 return true;
108             }
109         }
110
111         public static readonly Permission Empty = new PermissionEmpty();
112
113         #endregion
114     }
115 }

  本章剩余内容正在整理上传中。。。

时间: 2024-09-30 10:29:34

CodeArt入门教程(四)的相关文章

BootStrap入门教程 (四)

上讲回顾:Bootstrap组件丰富同时具有良好可扩展性,能够很好地应用在生产环境.这些组件包括按钮(Button),导航(Navigation),缩略图( thumbnails),提醒(Alert),进度条(progress bar)等,能够很好减少前端工程师的代码量,实现更加丰富充实的页面. Bootstrap作为一套良好的前端工具,要实现现代的动态页面效果,javascript插件是必不可少的.它提供了12个基于JQuery类库的插件,包括模态窗口(Modals),滚动监控(Scrolls

Git的入门教程&lt;四&gt;

Git 的入门教程<四> 5> git分支的管理 git默认的有一个主分支叫做master,随着每次的提交,master主分支会形成一条线,而HEAD是指向当前的主分支master的,一般来说,我们将master分支作为向外发布的主分支,而开发的时候会新建一个分支或者好多分支,作为开发分支,等到开发分支完成,在一次性的想master主分支上合并,并进行发布. 5.1 git 分支的创建.删除.切换 git branch dev //创建分支 git checkout dev //切换分支

无废话ExtJs 入门教程四[表单:FormPanel]

无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

BootStrap入门教程 (四) :JQuery类库插件(模态窗口,滚动监控,标签效果,提示效果,“泡芙”效果,警告区域,折叠效果,旋转木马,输入提示)

上讲回顾:Bootstrap组件丰富同时具有良好可扩展性,能够很好地应用在生产环境.这些组件包括按钮(Button),导航(Navigation),缩略图( thumbnails),提醒(Alert),进度条(progress bar)等,能够很好减少前端工程师的代码量,实现更加丰富充实的页面. Bootstrap作为一套良好的前端工具,要实现现代的动态页面效果,javascript插件是必不可少的.它提供了12个基于JQuery类库的插件,包括模态窗口(Modals),滚动监控(Scrolls

RabbitMQ入门教程(四):工作队列(Work Queues)

原文:RabbitMQ入门教程(四):工作队列(Work Queues) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78596426 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 工作队列 使用工作队列实现任务分发的功能,一个队列的优点就是很容易处理并行化的工作能力,但是如果我们积累了大量的工作,我们

Elasticsearch入门教程(四):Elasticsearch文档CURD

原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79217590 一: 新增文档POST /{index}/{type} 或 PUT /{index}/{type}/{id} 注意:新增文档时可以显式指定id,id可以是数字也可以是字符串,如果不显示指

WebGL入门教程(四)-webgl颜色

前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 颜色效果图: 操作步骤: 1.创建HTML5 canvas 2.获取画布 canvas 的 ID 3.获取WebGL 4.编译着色器 5.使用缓冲区对象向顶点传入多个顶点数据 6.绘制图像 以上1~3参考:http://www.cnblogs.com/bsman/p/6128447.html 4.编译着色器 改顶点着色器,片着色器 //顶点着色器程序 v

Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务

前一章, 我们的Hello world应用服务,通过配置服务器Config Server获取到了我们配置的hello信息"hello world". 但自己的配置文件中必须配置config server的URL(http://localhost:8888), 如果把config server搬到另外一个独立IP上, 那么作为一个client的hello world应用必须修改自己的bootstrap.yml中的config server的URL地址.这明显是不够方便的. 既然confi

CodeArt入门教程(三)

5.领域模型设计 下面我们创建账户子系统(AccountSubsystem),账户子系统虽然被门户服务使用,但是子系统本身是独立于任何服务存在的.所以我们为账户子系统创建独立的项目解决方案: 子系统的项目解决方案比服务的项目解决方案需要引用的程序集少很多.除了解决方案文件夹Framework里需要引用几个CodeArt提供的类库外,仅需额外创建一个AccountSubsystem的类库项目,稍后我们会在这个程序集里创建领域模型.AccountSubsystemTest则是针对账户子系统的单元测试