利用Apache Isis快速原型化-宠物诊所的宠物管理
前言
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快速原型化-宠物诊所的宠物管理的更多相关文章
- 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现
项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...
- 【Axure RP8.1】一款专业的快速原型设计工具
Axure RP是一款专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写.Axure RP是美国Axur ...
- axure rp ----专业的快速原型设计工具
Axure RPAxure的发音是』Ack-sure』,RP则是』Rapid Prototyping』快速原型的缩写.Axure RP Pro是美国Axure Software Solution公司的 ...
- 五种典型开发周期模型(瀑布、V、原型化、螺旋、迭代)
五种典型开发周期模型(瀑布.V.原型化.螺旋.迭代) 总结一下经常可以见到的系统开发周期模型. 在过去的几年里,可以很奇葩的碰到类似于“创业项目库”这种需求非常明确,工作量十分可控,对质量要求比 ...
- Hadoop基础-Apache Avro串行化的与反串行化
Hadoop基础-Apache Avro串行化的与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Apache Avro简介 1>.Apache Avro的来源 ...
- 什么是Apache Isis
这个页面展示了一个现代的 Apache Isis 应用程序的外观. 下边是Isis 插件里的 todoapp 示例 (非 ASF)截图,你可以随意使用. 界面里对应的领域类可以在这里找到. 这个 to ...
- 利用Apache部署静态网站(一)
Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充, ...
- axure快速原型设计工具
Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或Web网站的线框图.流程 ...
- 基于Axure的快速原型方法
Axure是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档.作为专业的原型设计工具,它能快速.高效的创建原型 ...
随机推荐
- Emmet使用方法
本文摘自:http://www.iteye.com/news/27580 Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语 ...
- MAC OS===>IntelliJ IDEA__ant__zookeeper源码编译
1:配置ant环境 https://archive.apache.org/dist/ant/binaries/ 官网下载文件 1.10.0以上需要JDK1.8以上 否则会报 Exception i ...
- easypoi导出单个sheet和多个sheet
今天有时间研究了一下easypoi,感觉使用了easypoi导出excel方便了很多,不用写很多复杂的反射,只需要使用注解和一些工具类就可以实现常用的excel的导出,接下来介绍一下easypoi如何 ...
- side Effect
副作用 side Effect 副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互. 副作用可能包含,但不限于: 1.更改文件系统 2.往数据库里插入数据 3.发送一个h ...
- html发展史简介(摘抄)
1993年,IETF,Internet工程任务组(Internet Engineering Task Force)的简写.IETF又叫互联网工程任务组,成立于1985年底,是全球互联网最具权威的技术标 ...
- CentOS使用fdisk扩展磁盘空间
使用情况: 1. 虚拟机配置150G硬盘,初始化为/dev/sdb1,后因为磁盘空间不够使用,动态扩容至300G,扩容完成后,想要动态扩容/dev/sdb1分区. 2. 磁盘空间300G,之前分区只划 ...
- Spring中无法访问resources目录下页面或静态资源
1.新建项目,在 resources 目录下创建 views 目录,在 views 目录下创建 index.html 页面,项目跑起来,浏览器访问页面,提示找不到页面之类的错误提示. 2.再尝试访问图 ...
- CentOS 7 下 安装Webmin 启动防火墙失败----Applying firewall rules:iptables-restore:line 2 failed
最近学习CentOS 7 系统管理,使用的是<CentOS 6.X系统管理实战宝典>一书------因为网购的CentOS 7 的书还没有送到 O(‘ ’!!)O~ (1)先使用yum方 ...
- 制作Makefile中 ** missing separator 错误解决
非常简单就是根据提示,在这一行的前面摁Tab键 错误如上图所示:
- springmvc/springboot处理前台字符串日期自动转换成后台date类型的三种办法
参考https://blog.csdn.net/eumenides_/article/details/79033505 补充一个:Formatter也可以实现.