前言

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. idea快捷键、常用设置

      代码提示: code completion :ALT + / 选用Eclipse的keymap. 设置代码助手快捷键(keymap-basic) 代码上下行复制(Ctrl + Alt + Down ...

  2. javaweb之jsp的属性范围

    1.什么是jsp的属性范围? 所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以保存并继续使用.jsp提供了四种属性范围,如下: 当前页,对应的jsp对象为pageContext,属 ...

  3. 八 SocketChannel

    SocketChannel是一个连接到Tcp网络套接字的通道.可以通过以下两种方式创建SocketChannel: 1.打开一个SocketChannel并连接到互联网上的某台服务器. 2.一个新连接 ...

  4. docker 数据卷挂载总结

    原文

  5. centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题

    参考原文:  https://www.cnblogs.com/kimyeee/p/7250560.html   https://www.cnblogs.com/galaxy-gao/p/5796488 ...

  6. HADOOP背景介绍

    1. HADOOP背景介绍 1.1 什么是HADOOP 1. HADOOP是apache旗下的一套开源软件平台 2. HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分 ...

  7. React Native之React速学教程(上)

    概述 本篇为<React Native之React速学教程>的第一篇.本篇将从React的特点.如何使用React.JSX语法.组件(Component)以及组件的属性,状态等方面进行讲解 ...

  8. Re-thinking Deep Residual Networks

    本文是对ImageNet 2015的冠军ResNet(Deep Residual Networks)以及目前围绕ResNet这个工作研究者后续所发论文的总结,主要涉及到下面5篇论文. 1. Link: ...

  9. unity中Animation与Animator的区别

    Animation:单一动画,一般使用在单一动画播放.占用资源小. Animator:多个动画,可用控制器切换多个动画播放.占用资源大.

  10. 从数据库读取数据后将其输出成html标签

    最常用的方法,使用JS或JQ JQ: $("#div").html("<span>我是HTML代码</span>"); JS: var ...