领域驱动编程,代码怎么撰写?
来源:车险 2023年03月01日 12:15
使用者端口层所须要的功用动手到是由UDP进行时,这之中一般不须要展开缺少;还有。UTF-时,该层可以十分需要带入UDP中都度量的端口,因而该层缺少UDP。须要警惕的是,虽然概念上使用者端口层可以十分需要用作教育领反之亦然层和交通运输层的技能,但这之中提议大家在对这种用法娴熟掌握前,最好换用严格的最上层虚拟立体化,即概念上层只缺少其下方相邻的一层。
UDP
UDP确切动手到端口层中都须要功用,但该层十分动手到真正的业务范围规章,而是根据实际的 use case 来相互配合codice_教育领反之亦然层提供者的技能。
消息收发、流血事件窃听、政务控制等提议在这一层动手到。在编译机内技术性平常用作的包被命名可以是 application, service, manager 等。它用来取代 Spring MVC 中都 service 层,并把业务范围演算转移到教育领反之亦然层。
教育领反之亦然层
教育领反之亦然技术性向都可的,它主要用来凸显和动手到教育领反之亦然之中的都可所合乎的固有技能。因此,在教育领反之亦然马达程式设计中都,教育领反之亦然层的程式设计动手到是不无需缺少其他结构上都可的,教育领反之亦然层的程式设计是在我们对教育领反之亦然内的都可所合乎的固有技能和它要在概念上业务范围片中下展现什么样的技能有一定理解后,可以十分需要UTF-动手到的。
例如我们最开始接触高端都可的程式设计的时候,平常亦会遇到的一个举例是鸟亦会扑、狗亦会跳高,推论我们的业务范围反之亦然只关心这些都可的运动,我们可以动手如下的动手到。
public interface Moveable {
void move();
}
public abstract class Animal implements Moveable {}
public class Bird extends Animal {
public void move(){
//try to fly
System.out.println("I'am flying");
}
}
public class Dog extends Animal {
public void move(){
//try to swim
System.out.println("I'am swimming");
}
}
基于教育领反之亦然马达的程式设计须要这样(充血数学原理)去动手到都可的技能,而不是像我们在 MVC 虚拟立体化中都平常用作高血压数学原理,把业务范围演算写就在 service 中都。
当然,即使换用了这样的程式设计方式为,相距动手到教育领反之亦然马达要强的近,一些看似简单的克服办法就意味著给我们导致巨大的不安感。例如十分复杂的都可必要如何模板和发挥作用立体化?同样一个感官在多种不同教育领反之亦然都存在,但其出发点多种不同时这个感官必要分别怎么直观?多种不同教育领反之亦然的都可须要对方的资讯时,必要怎么赚取?
这些克服办法,我们也亦会在编译机内示例均设法给出一些椿考的提议。
交通运输层
交通运输层为之中面各层提供者通用的数据处理技能,例如窃听、收发消息的技能,数据资料库/调用/NoSQL数据资料库/硬盘等自营的 CRUD 技能等。021
2、小结
根据对教育领反之亦然马达本体设计各层的实质性数据分析,一个越来越加确切立体化的最上层本体如下。
基于之中面的最上层原则,前述杠杆教育领反之亦然一个可以椿考的编译机内本体如下,我们将在前面UTF-示例参考概述每一个中标被的理念和作用。
教育领反之亦然马达研发的编译机内概念上,DOMAIN 不缺少其他宏观且是业务范围两大,我们必要可先编写就教育领反之亦然层编译机内,但是一则由于我们对杠杆教育领反之亦然基础知识的加上,意味著不清楚本金到底有哪些固有技能;二则为了便于概述,因此我们十分需要能用一个用例来简介编译机内。
1、用例
使用者在前端页面必需杠杆的产品,必需可必需的保障负起,读取投/被保人资讯,必需偿还方式为(分期/趸交等)并偿还后送交保险公司立即; 一站式端不着迷保险公司立即 -> 核保 -> 出单 -> 下发本金权益。 这之中用例 1 是用例 2 的换用用例,我们也就是说用例 1 不太意味著顺利进行时(用例 1 中都进行时了计费计算),只来动手到用例 2,并且用例 2 也只是由此可知的动手到,只要能把编译机内款式简介即可。2、使用者端口层程式设计有系统会
中标被本体
其中都 client 是对 inusurance-client (公共二方包被) 均的动手到,web 是 rest 音乐风格端口的动手到。
用例编译机内
@AllArgsConstructor
@RestController
@RequestMapping("/insure")
public class PolicyController {
private final InsuranceInsureService insuranceInsureService;
/**
* 保险公司出单
* @param request
* @return 本金 ID
*/
@RequestMapping(value = "/issue-policy", method = RequestMethod.POST)
public String issuePolicy(IssuePolicyRequest request){
return insuranceInsureService.issuePolicy(request);
}
}
这之中比如说的入椿和来到取值的类都在UDP中都度量。
3、UDP程式设计有系统会
1、中标被本体
其中都最外层端口是高端确切业务范围片中的,可以根据业务范围发展再展开中标被。 pojo 包被中都度量了UDP比如说的各种数据资料类(之中面的 IssuePolicyRequest 就在这之中)及其向其他层传播时须要展开类DF类比的生成机内。 tasks 包被中都度量了一些若有任务的入口。警惕,在教育领反之亦然程式设计技术性都,亦会须要十分多的类DF类比,我们可以能用一些框架(例如 MapStruct[2])来增大这些类DF类比给我们导致的繁杂社会活动。
2、用例编译机内
@Service
@AllArgsConstructor
public class InsuranceInsureServiceImpl implements InsuranceInsureService {
private final PolicyFactory policyFactory;
private final StakeHolderConvertor stakeHolderConvertor;
private final PolicyService policyService;
/**
* 政务控制一般在UDP
* 但是须要警惕最底层驱动器对政务的反对结构上
* 最底层是分库分表时,意味著须要其他手段来保证政务,或者将非两大的操译者从政务中都分离出来(例如数据资料库 ID 生成)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public String issuePolicy(IssuePolicyRequest request) {
Policy policy = policyFactory.createPolicy(request.getProductId(),
stakeHolderConvertor.convert(request.getStakeHolders()));
//出单妥善处理过程控制
policyService.issue(policy);
PolicyIssuedMessage message = new PolicyIssuedMessage();
message.setPolicyId(policy.getId());
MQPublisher.publish(MQConstants.INSURANCE_TOPIC, MQConstants.POLICY_ISSUED_TAG, message);
return policy.getId().toString();
}
}
这之中编译机内简介的是UDP对用例 2 的妥善处理。
用作教育领反之亦然层的厂房类构筑 Policy 剪切。如果须要传递十分复杂都可,须要可先用类DF类比机内将UDP的数据资料类生成为教育领反之亦然层的十分一定类或者取值都可。 用作教育领反之亦然层一站式控制出单妥善处理过程 收发来单成功消息,其他教育领反之亦然窃听到着迷的消息亦会展开响应。4、教育领反之亦然层程式设计有系统会
1、中标被本体
这之中教育领反之亦然层一共有5个一级中标被。
anticorruption 是教育领反之亦然贮存层,是概念上教育领反之亦然须要获知其他教育领反之亦然或者结构上资讯时,对其他教育领反之亦然二方包被的烧录。贮存层从编译机内技术性来看,可以消除codice_结构上客户端时,在教育领反之亦然内部展开十分复杂的椿数拼装和结果的类比。 factory 克服了十分复杂剪切的模板克服办法。我们本体设计好教育领反之亦然数学原理供结构上codice_,但如果结构上也不必用作如何装配这个都可,则不必知道都可的内部本体。对codice_方研发来说这是很不友好关系的。其次,十分复杂都可或者剪切当中都的教育领反之亦然基础知识(业务范围规章)须要得到满足,如果让结构上自己装配十分复杂都可或剪切的话,就亦会将教育领反之亦然基础知识泄露到codice_方编译机内中都去。须要警惕的是,这之中主要是把剪切或十分一定须要的数据资料复合进来,而不涉及都可的暴力行为。因此这之中厂房的两大作用是从各处拉取模板剪切或十分一定所须要的结构上数据资料。
@Service
@AllArgsConstructor
public class PolicyFactory {
/**
* 的产品教育领反之亦然贮存层一站式
*/
private final ProductService productService;
/**
* 从各种数据资料来源查询十分需要能查到的换用数据资料,复合到 policy 中都
* @param productId
* @param stakeHolders
* @return
*/
public Policy createPolicy(Long productId, List stakeHolders) {
PolicyProduct product = productService.getById(productId);
//其他复合数据资料,这之中codice_了剪切自身的静态厂房原理
Policy policy = Policy.create(product, stakeHolders);
return policy;
}
}
model 中都是教育领反之亦然都可的度量。其中都 vo 包被中都度量了教育领反之亦然内比如说的取值都可。可以看着这之中有PolicyProduct 这样一个杠杆的产品类,在保险公司教育领反之亦然,我们关注的是和本金就其的某个的产品及其快照资讯,因此我们在这之中度量一个本金杠杆的产品类,贮存层全权负责把从的产品反之亦然获得的杠杆的产品资讯类比为我们关心的本金杠杆的产品类都可。 按照教育领反之亦然马达本体设计的最佳有系统会,教育领反之亦然都可数学原理中都不无需出现 service、repository 这些以此赚取结构上资讯的刚才,它的两大概念是一个完备的十分一定模板进行时后,它能动手什么,或者它境况了什么再次状态亦会发生怎样的变立体化。前面是教育领反之亦然内两大的剪切 Policy 的示例编译机内。
@Getter
public class Policy {
private Long id;
private PolicyProduct product;
private List stakeHolders;
private Date issueTime;
/**
* 厂房原理
* @param product
* @param stakeHolders
* @return
*/
public static Policy create(PolicyProduct product, List stakeHolders){
Policy policy = new Policy();
policy.product = product;
policy.stakeHolders = stakeHolders;
return policy;
}
/**
* 本金出单
*/
public void issue(Long id) {
this.id = id;
this.issueTime = new Date();
}
}
repository 是自营包被,只度量自营端口,不关心确切动手到,确切的动手到交给交通运输层全权负责,凸显了缺少;还有的理想主义。 service 是教育领反之亦然一站式,它度量一些等同于教育领反之亦然都可的暴力行为,但是又有必要的操译者,比如一些妥善处理过程控制。2、用例编译机内
@Service
@AllArgsConstructor
public class PolicyService {
private final InsureUnderwriteService insureUnderwriteService;
private final PolicyRepository policyRepository;
public void issue(Policy policy) {
if(!insureUnderwriteService.underwrite(policy)){
throw new BizException("核保失败");
}
policy.issue(IdGenerator.generate());
//保存资讯
//policyRepository.save(policy);
policyRepository.create(policy);
}
}
这之中警惕我们注掉了一行 policyRepository.save(policy);,那么为什么要区别 save 和 create 呢?
save 是教育领反之亦然马达本体设计中都最适当的动手法:我的剪切或者十分一定有变动,自营不用关心是新建还是新增,帮我保存起来就好了。听上去很盼望,但对关系DF数据资料库驱动器毕竟很不友好关系的。因此,在我们的片中之中,须要违背一下书上都是的最佳有系统会,我们十分知道自营是要新建还是新增,甚至如果是新增的话新增的是哪些列。
另外教育领反之亦然马达的最佳有系统会是基于流血事件马达的,AxonFramework 对其有令人枉忘的动手到,UDP发来一个 IssuePolicyCommand 命令,教育领反之亦然层调拨该命令,进行时本金建立后发来PolicyIssuedEvent,该 event 亦会被窃听并且发挥作用立体化到 event store 中都。这种方式为迄今为止似乎在我们这之中合上的不太意味著十分大,不动手越来越多参见。
5、交通运输层程式设计有系统会
1、中标被本体
这之中只简介了 repository 的动手到,但实际上这之中还有 RPC codice_的二方包被动手到类注入等很多主旨。上文说到教育领反之亦然层不关心自营的动手到,交给交通运输层全权负责。交通运输层可以根据须要用作关系DF数据资料库、调用或者NoSQL,教育领反之亦然层是无感受的。这之中我们以关系DF数据资料库为例来,dao 和 dataobject 等都可以用作例如 mybatis generator 等来进行生成,教育领反之亦然都可 和 dataobject 之间的类比由 convertor 全权负责。
2、用例编译机内
@Repository
@AllArgsConstructor
public class PolicyRepositoryImpl implements PolicyRepository {
private final PolicyDAO policyDAO;
private final StakeHolderDAO stakeHolderDAO;
private final PolicyConvertor policyConvertor;
private final StakeHolderConvertor stakeHolderConvertor;
@Override
public String save(Policy policy) {
throw new UnsupportedOperationException();
}
@Override
public String create(Policy policy) {
policyDAO.insert(policyConvertor.convert(policy));
stakeHolderDAO.insertBatch(stakeHolderConvertor.convert(policy));
//...其它数据资料入库
return policy.getId().toString();
}
@Override
public void updatePolicyStatus(String newStatus) {
}
}
这均编译机内非常简单,不须赘言。
摘录关于教育领反之亦然马达,来龙去脉仍处于才行期中,再好的本体设计,随着业务范围的发展,编译机内也枉免越来越混乱,这个过程中都,每个椿与者都有负起。先前,阐述一下我们维系编译机内初心的一些原则,和大家分享。
有系统会解释业务范围片中,数据分析用例,展开适当的教育领反之亦然分界。 确定好动手到方式为后,大家以求按照既定模式/音乐风格程式设计,有异议的区域内可以一起研讨后实质上删减。 不带入能避免的十分维度。 不断对系统会本体设计展开简立体化小型化,对繁杂的编译机内,用本体设计模式展开简立体化。 写就译文。[1]
[2]
本文为阿之中云原创主旨,未经无需不得转贴。
。宁波白癜风专科医院哪里好上海妇科专科医院
博士伦滴眼液和海露滴眼液选哪个牌子好
天津看妇科去哪家好
如何快速治疗宝宝腹泻
-
你是什么血型,就是什么神经质(太准啦!)
据科学研究工作,人的个性回事在胚胎时期就不太可能要求了。只是后期环境的不同,时会稍稍改变而已。 要求我们个性的非同因素很多,其中就有噬型之外。国外有名系主任曾对1245名实例透
- 3只柯基围着暖炉取暖,铲屎官去了趟卧室回来,却总看来哪里变了
- 首华燃气可转债中签号公诸于世 共107.45万个
- 50岁阿姨的群居生活:48㎡小家装修优雅复古,大气十足,让人羡慕
- 中红医疗:截止到第三季度,公司手套产能为90亿只左右,PVC手套产能为80亿只左右,第四季度已试车投产了50亿只手套,截止到已确定,公司拥有140亿只手套的产能。
- 新的家入住三个月,装修踩了9个坑,都是真金白银买回来的教训
- 写出创造价值 解锁5G时代写出新方式
- 雪天盐业:雪天小包食盐出厂价早先陆续提价 工业盐涨幅30%-50%
- 装修设计:实用70平,纯朴复古刚需三室
- 台湾女艺人陈竹音:已准备把台湾户籍迁入大陆,放弃台湾健保
- 曝光女生尴尬的三大瞬间,看看你经历过哪个!这真的女友太尴尬了