从零开始使用CodeArt实践最佳领域驱动开发(五)

本章内容还在整理上传中,你可以等全部更新完毕后再查阅也可以先预览已上传的内容。。。。。。

7. 应用层的命令模式

  在上个章节里我们设计并编码了领域对象Permission,但是目前Permission并没有任何行为上的设计。这是因为我们不建议“凭空去制造行为”,而是在领域对象第一个版本的代码实现之后就立即使用它。在使用过程中观察外界(应用层或其他领域对象)对它的需求,这些需求往往暗藏了进一步揭露对象本质特征的提示。我们可以根据这些提示逐渐挖掘出该对象更多的行为特征,结合CA里相关的设计原则,最终我们可以确认领域对象该如何提供哪些行为方法。所以,大家不要在意领域对象在设计初期有点类似“贫血模型”,因为这不是它的最终形态,这只是它成长的起点。那如果经过一番尝试后,我们还是没有为对象添加任何方法呢?这种情况的确存在,有些对象存在的意义只是被别的对象引用,自身并没有提供任何行为方法,但是如果你的项目里大量充斥着没有行为的领域对象,这就值得你警惕了,肯定是设计上出现了重大的错误。不过只要大家依照教程里的设计原则实施项目,基本上不会出现这种情况,所以也不必太过担心。

  因此,我们暂且放下对领域模型的思考,将思路转移到应用层,考虑应用层对Permission有什么需求。涉及到应用层我们又不得不考虑表现层对应用层会有哪些需求,最终我们会发现要思考的问题其实是终端用户会有什么需求。所以,我们考虑第一个问题:用户怎么使用权限机制?这个话题在前文也讨论过,这里我们只用考虑用户使用权限的第一个必须操作是什么?

  当然是为项目创建权限描述了,我们需要定义整个项目提供了哪些权限,只有定义了权限信息后系统才能以此为参考识别登录者可以使用哪些功能。因此,创建权限信息是用户的第一个操作需要。但是我们要从使用者的角度对这个需求点进一步修正:“系统管理员可以定义整个项目提供了哪些功能”。系统管理员指的是项目搭建好后,设置项目初始参数的人,这类人比普通用户更加了解系统(往往是我们自己)。从UI界面操作体验上来讲,提示使用者“定义整个项目提供了哪些功能”比“定义整个项目提供了哪些权限”要更容易理解。

  分析到这里,我们就知道不论UI界面怎么描述,应用层都要提供“创建权限”的功能。所以我们以创建权限为示例讲述如何建立应用层的命令。

  在CA的4层架构里,应用层由服务和子系统提供的命令组成。也就是说,AccountSubsystem里除了定义领域模型的内容外还会提供一组命令给外界使用,这组命令我们将其划分为应用层的范围。请大家注意,CA里的层次结构是一个概念而不是真实的物理布局。虽然不同的层次往往物理布局不一样,但是也有例外的时候,这里的子系统提供的命令就是和领域模型在一个程序集里,但是所处不同的层次结构,命令属于应用层,领域对象属于领域模型层。(当然,你就算不理解这点也无所谓,对开发项目没什么影响。)

  下面贴出创建权限的命令代码并作出说明:

using System;
using System.Linq;

using CodeArt;
using CodeArt.DomainDriven;

namespace AccountSubsystem
{
    public sealed class CreatePermission : Command<Permission>
    {
        private string _name;

        public string Description
        {
            get;
            set;
        }

        public string MarkedCode
        {
            get;
            set;
        }

        public CreatePermission(string name)
        {
            _name = name;
        }

        protected override Permission ExecuteProcedure()
        {
            Permission permission = new Permission(Guid.NewGuid())
            {
                Name = _name,
                MarkedCode = this.MarkedCode ?? string.Empty,
                Description = this.Description ?? string.Empty
            };

            var repository = Repository.Create<IPermissionRepository>();
            repository.Add(permission);

            return permission;
        }
    }
}

  这是一段非常简单的命令代码,

时间: 2024-11-07 00:42:22

从零开始使用CodeArt实践最佳领域驱动开发(五)的相关文章

.NET领域驱动开发(DDD)框架搭建

详细内容讲解:https://study.163.com/course/introduction/1005643030.htm?share=1&shareId=1142344671 内容:一步一步搭建一个实用的基于领域驱动设计(DDD)开发模式的一个项目开发框架.通过结合实际的代码应用让大家对领域驱动开发有一个更好的理解. 源码:https://github.com/lidingbin/MicBeach.Framework 原文地址:https://www.cnblogs.com/xiaoico

领域驱动开发推荐代码示例 — Microsoft NLayerApp

简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/. 架构图: 点击查看大图 代码下载:http://microsoftnlayerapp.codeplex.com/releases/view/56660 所用到的软件: - Microsoft Visual Studio 2010  - Microsoft Ex

领域驱动系列五模型驱动设计的构造块

一.简介 为了保证软件实现的简洁性,并且与模型保持一致,不管实际情况有多复杂,必须使用建模和设计的最佳实践,即让通过我们的编程技术(设计模型.指责驱动.契约式设计)充分地体现领域模型,并保持模型地健壮性和可扩展性,而不是单单地实现模型.某些决策设计能和模型紧紧地结合,这种结合要求我们注意每个元素地细节. 开发一个好的领域模型是一门艺术,而模型中的各个元素的实际设计和实现则相对系统化,将领域设计(也可以是软件系统中的其他关注点)与软件系统中的其他关注点(也可以是领域设计)分离使整个领域模型非常的清

Spring注解驱动开发(五)-----扩展原理

扩展原理 1.BeanPostProcessor-----bean后置处理器,bean创建对象初始化前后进行拦截工作的 2.BeanFactoryPostProcessor-----beanFactory的后置处理器在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建. 注:首先spring容器会创建beanDefinition,此时bean并没有初始化. 示例: ExtConfi

.NET领域驱动设计—初尝(疑问、模式、原则、工具、过程、框架、实践)

阅读目录: 1.1.疑问 1.1.1.UML何用 1.1.2.领域建模 1.2.模式 1.3.原则 1.5.过程 1.6.框架 1.7.项目演示 最近在研究DDD颇有收获,所以整理出来跟大家分享,共同进步! 我们在设计业务系统的时候都会存在一个非常棘手而又无法回避的问题"业务扩展性"."业务灵活性."面向对象化",尽管我们熟练掌握设计思想.设计模式.设计原则等等关于如何设计灵活性的系统设计理论,但是我们似乎都没有将它们运用到真正业务系统设计.开发当中去,为

.NET领域驱动设计—初尝(一:疑问、模式、原则、工具、过程、框架、实践)

.NET领域驱动设计—初尝(一:疑问.模式.原则.工具.过程.框架.实践) 2013-04-07 17:35:27 标签:.NET DDD 驱动设计 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangqingpei557.blog.51cto.com/1009349/1173006 1.1.疑问 1.1.1.UML何用 1.1.2.领域建模 1.2.模式 1.3.原则 1.4.工具 1.5.过程 1.6.框架 1.7.项

项目架构开发:业务逻辑层之领域驱动失血模型

前边我们构建了个数据访问层,功能虽然简单,但是基本够用了.传送门:项目架构开发:数据访问层 这次我们构建业务逻辑层 业务逻辑是一个项目.产品的核心,也是现实世界某种工作流程在代码层面的体现. 所以,业务逻辑的合理组织构造,或更真实地反映现实业务操作,对项目的成功与否非常重要 现在业界对业务逻辑层的开发,一般会参考Martin Fowler大师提出来的针对业务层开发的四种模式 分别是面向过程的事务脚本.表模块模式,面向对象的活动记录与领域开发模式 我们要做的就是领域驱动开发模式,注意标题中的“失血

领域驱动设计(DDD)部分核心概念的个人理解(转)

领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践和经验技巧.只有对领域的不断深入认识,才能得到一个解决领域核心问题的领域模型.如果一个应用的复杂性不是在技术方面的,而是在领域本身,即领域内的业务很复杂,那这种应用,使用领域驱动设计的价值就越大. 领域驱动开发也是一种敏捷开发过程(极限编程,XP),强调迭代开发.在迭代过程中,强调开发人员与领域专家

领域驱动设计核心

转载 领域驱动设计(DDD)部分核心概念的个人理解 领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践和经验技巧.只有对领域的不断深入认识,才能得到一个解决领域核心问题的领域模型.如果一个应用的复杂性不是在技术方面的,而是在领域本身,即领域内的业务很复杂,那这种应用,使用领域驱动设计的价值就越大. 领域驱动开发也是一种敏捷开发过程(极限编程,XP)