前言

Apache Isis是DDD方法的一个实现框架。

需求分析

宠物诊所需要记录宠物的资料,包括类型、名字、及其主人。

多个宠物可能同属于一个主人。

宠物可能更换主人。

宠物主人记录姓名,我们可以按姓名来查找宠物主人。

需求建模

根据需求,我们可以创建宠物(Pet)和宠物主人(Owner)两个实体类。宠物和主人是一对多的关系。宠物可以变更主人,当然这里我仅限于宠物来选择主人,那给宠物换主人就是宠物自身的一个行为。

创建宠物和创建宠物主人,我们需要相应业务对象来进行初始化操作。这个业务对象可以认为是一个工厂,专门用来创建不存在的实体对象。

宠物主人的查询,我们也是通过业务对象来进行实体的检索。这个业务对象可认为是一个实体仓库,我们从中检索需要的实体对象。

通过以上描述,我们建立以下的UML图形。

宠物诊所静态模型

注:由于业务规则相当简单,为了简化编程步骤,这里的宠物主人的查询和创建放到了一个类中。

程序设计

ISIS的程序设计,关注点是业务规则(Service、Action、Entity)。Service为功能项,表现为主菜单;Action为用户操作,表现为菜单项或按钮;Entity用户操作的内容或结果,表现为具体的数据表单。Service和Entity都可以承载Action。

宠物主人管理的业务实现

将宠物主人的业务对象定义为DomainService,表明此对象宠物主人操作的入口。DomainService.repositoryFor()表明,这个类也是Owner的实体仓库。Owners 在系统中对应一个菜单。

@DomainService(repositoryFor = Owner.class)public class Owners {
//....
}

给这个类创建两个动作(方法),一个是创建宠物主人(Owner),另一个是用名字来查询。create方法对应创建这个动作,在界面上对应一个Create的菜单项。create参数对应创建动作要输入的内容,在界面上表现为一个输入表单。findByName同理,不过create和findByName的区别是返回不一样,前者返回所创建实体的内容(详情页),后者返回查询的实体集合(列表页)。

 @MemberOrder(sequence = "2")
public Owner create(
final @ParameterLayout(named = "Name") String name) {
final Owner obj = repository.instantiate(Owner.class);
obj.setName(name);
repository.persist(obj);
return obj;
} //endregion //region > findByName (action)
@MemberOrder(sequence = "1")
public List<Owner> findByName(
@ParameterLayout(named = "Name")
final String name) {
final String nameArg = String.format(".*%s.*", name);
final List<Owner> owners = repository.allMatches(
new QueryDefault<>(
Owner.class,
"findByName",
"name", nameArg));
return owners;
}

这里使用了持久化服务,这里的持久化是保用的关系型数据库。

宠物管理的业务实现

同样先定义Service。

@DomainService(repositoryFor = Pet.class)
public class Pets {
//...
}

再创建Action

public Pet create(
final @ParameterLayout(named = "宠物名字") String name,
final @ParameterLayout(named = "宠物类型") PetSpecies species,@ParameterLayout(named = "宠物主人") final Owner owner) {
final Pet pet = repository.instantiate(Pet.class);
pet.setName(name);
pet.setSpecies(species);
pet.setOwner(owner);
repository.persist(pet);
return pet;
}

Pet的Action

    public Pet changeOwner(Owner owner) {
setOwner(owner);
return this;
}

一些扩展设计

对于宠物主人的选择,为了达到与相应实体类的完全匹配,更多的时候考虑采用下拉选择。ISIS提供了一些协定,比如choice,autoComplete前辍的动作,辅助数据项的选择。

    public List<Owner> autoComplete0ChangeOwner(final @MinLength(1) String name) {
return owners.findByName(name);
}

  

public List<Owner> autoCompleteOwner(final @MinLength(1) String name) {
return owners.findByName(name);
}

 
autoComplete0ChangeOwner 方法可以理解为:autoComplete模糊,对应的参数位置: 0 ,对应的动作:ChangeOwner,
autoCompleteOwner,对应属性修改的自动完成。

运行效果

创建宠物实体

宠物列表

宠物详情

修改宠物主人

利用Apache Isis快速原型化-宠物诊所的宠物管理的更多相关文章

  1. 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现

    项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...

  2. 【Axure RP8.1】一款专业的快速原型设计工具

    Axure RP是一款专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写.Axure RP是美国Axur ...

  3. axure rp ----专业的快速原型设计工具

    Axure RPAxure的发音是』Ack-sure』,RP则是』Rapid Prototyping』快速原型的缩写.Axure RP Pro是美国Axure Software Solution公司的 ...

  4. 五种典型开发周期模型(瀑布、V、原型化、螺旋、迭代)

    五种典型开发周期模型(瀑布.V.原型化.螺旋.迭代) 总结一下经常可以见到的系统开发周期模型.    在过去的几年里,可以很奇葩的碰到类似于“创业项目库”这种需求非常明确,工作量十分可控,对质量要求比 ...

  5. Hadoop基础-Apache Avro串行化的与反串行化

    Hadoop基础-Apache Avro串行化的与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Apache Avro简介 1>.Apache Avro的来源 ...

  6. 什么是Apache Isis

    这个页面展示了一个现代的 Apache Isis 应用程序的外观. 下边是Isis 插件里的 todoapp 示例 (非 ASF)截图,你可以随意使用. 界面里对应的领域类可以在这里找到. 这个 to ...

  7. 利用Apache部署静态网站(一)

    Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充, ...

  8. axure快速原型设计工具

    Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或Web网站的线框图.流程 ...

  9. 基于Axure的快速原型方法

    Axure是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档.作为专业的原型设计工具,它能快速.高效的创建原型 ...

随机推荐

  1. Linux_vim文本编辑器指令整理

    一般指令模式 : 可以移动光标,可以删除字符和删除整列,可以复制粘贴 编辑模式 : 按下"i, I, o, O, a, A, r, R"任意一个字母时进入;按下ESC退出编辑模式 ...

  2. linux 添加开机自启动脚本

    原文 Linux设置服务开机自动启动的方式有好多种,这里介绍一下通过chkconfig命令添加脚本为开机自动启动的方法. 1. 编写脚本autostart.sh(这里以开机启动redis服务为例),脚 ...

  3. 比较全的css重设

    一.最简化的CSS Reset(重设) : * { padding:; margin:; } 这是最普遍最简单的CSS重设,将所有元素的padding和margin值都设为0,可以避免一些浏览器在理解 ...

  4. NOI.AC NOIP模拟赛R3解题报告

    心路历程 预计得分:\(100+100+50=250\) 实际得分:\(10 +100 +50 = 160\) 三道原题,真好.T2做过,T1写了个错误思路,T3写了写50分状压dp. 整场考试实际在 ...

  5. vue-构建项目相关事项

    安装 :vue-cli npm install -g vue-cli 使用webpack 打包 vue 項目的創建: vue init webpack 項目名子 生產基本的項目結構后 進入到項目目錄 ...

  6. React Native之React速学教程(下)

    概述 本篇为<React Native之React速学教程>的最后一篇.本篇将带着大家一起认识ES6,学习在开发中常用的一些ES6的新特性,以及ES6与ES5的区别,解决大家在学习Reac ...

  7. Tesseract-OCR-04-使用 jTessBoxEditor 进行训练

    Tesseract-OCR-04-使用 jTessBoxEditor 进行训练 本篇是关于 jTessBoxEditor 进行训练,使 Tesseract-OCR 文字识别准确率得到极大的提高,本篇完 ...

  8. 微信小程序开发前期准备

    开发文档 官方开发文档 开发IDE 官方工具下载 UI组件 WeUI:是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,新手建议使用: ZanUI-WeAp ...

  9. mysql 链接报 Can't connect to MySQL server on 'localhost' (10061)

    之前好好的,重启了下电脑就报了上面的问题... 解决办法很简单:重启下mysql的服务: win7系统,电脑-管理-服务和应用程序-服务,找到mysql重启 即可.

  10. Linux系统下安装Gitlab

    Linux系统下安装Gitlab 一.简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与 ...