NLayerAppV3-Distributed Service Layer(分布式服务层)
回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目。
NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的;它包含了开发人员和架构师都可以重用的DDD层。
Github地址:https://github.com/cesarcastrocuba/nlayerappv3
本篇介绍Distributed Service Layer(分布式服务层)
1、Distributed Service Layer(分布式服务层)
借用dax.net的话:
当应用程序以服务提供商(Service Provider)的方式向其它远程应用程序提供业务功能时,或者应用程序的客户端本身是被部署在另一个远程位置时,其业务逻辑就必须通过分布式服务层向外界发布。
分布式服务层(通常被实现为Web Service)可以根据可配置的通信通道与数据消息格式,为应用程序提供远程访问的功能。需要注意的是,分布式服务层中不应该包含任何业务逻辑的实现。
DistributedServices.MainBoundedContext项目,创建的是.net core2.1 webapi项目。
RESTful方式
BankAccounts通过构造函数注入应用层的IBankAppService契约,调用应用层的业务,对外提供服务;Startup类中配置EntityFramework、各种依赖注入、swagger UI的相关配置
.net core2中如何使用swagger,网上有好多介绍,也可以查看其GitHub:https://github.com/domaindrivendev/Swashbuckle.AspNetCore
为了应对服务的版本变化,使用swagger可以实现api服务多版本控制,可以参考这篇文章https://www.cnblogs.com/intotf/p/10075331.html
进阶:有了api服务,那么api服务的认证和授权问题,如何解决呢?,可以使用identityserver4;如果只需要认证,则结合jwt,就可以实现。

2、总结
NLayerAppV3的基础设施层、领域层、应用层、分布式服务层到目前就基本介绍完了,我们来总结下
基础设施层
包含了两个部分:Data部分和CrossCutting部分;
Data部分是仓储的层超类型、UOW以及仓储的实现。
CrossCutting部分则提供了通用功能的支撑,目前包含三部分:适配器、国际化和验证。分两个项目,一个项目是定义契约,另一个是实现。
领域层,是核心部分
包含仓储的契约、实体的接口和基类、值对象的基类、UOW契约、规约等;聚合的划分、领域服务等。
应用层
协调领域模型与其它应用、包含事务调度、UOW、事务等。
分布式服务层
调用应用层对外提供服务。
3、调用关系
我们以银行转账业务为例,说明各层的调用逻辑关系
服务http://localhost:55638/api/BankAccounts PUT
输入源账户信息、目标账户信息、转账金额,服务接收到的是对应的DTO对象;
然后调用应用层的转账方法,应用层接收参数,利用仓储调用查找有无对应的账户实体,如果有,则开始转账:
开启事务,调用领域层的转账服务转账,仓储调用UOW,提交,事务完成,关闭事务。
银行转账的应用层服务代码
public void PerformBankTransfer(BankAccountDTO fromAccount, BankAccountDTO toAccount, decimal amount)
{
//Application-Logic Process:
// 1º Get Accounts objects from Repositories
// 2º Start Transaction
// 3º Call PerformTransfer method in Domain Service
// 4º If no exceptions, commit the unit of work and complete transaction if (BankAccountHasIdentity(fromAccount)
&&
BankAccountHasIdentity(toAccount))
{
var source = _bankAccountRepository.Get(fromAccount.Id);
var target = _bankAccountRepository.Get(toAccount.Id); if (source != null & target != null) // if all accounts exist
{
using (TransactionScope scope = new TransactionScope())
{
//perform transfer
_transferService.PerformTransfer(amount, source, target); //comit unit of work
_bankAccountRepository.UnitOfWork.Commit(); //complete transaction
scope.Complete();
}
}
else
_logger.LogError(_resources.GetStringResource(LocalizationKeys.Application.error_CannotPerformTransferInvalidAccounts));
}
else
_logger.LogError(_resources.GetStringResource(LocalizationKeys.Application.error_CannotPerformTransferInvalidAccounts)); }

NLayerAppV3-Distributed Service Layer(分布式服务层)的更多相关文章
- Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集)
Spark的核心RDD (Resilient Distributed Datasets弹性分布式数据集) 原文链接:http://www.cnblogs.com/yjd_hycf_space/p/7 ...
- RDD内存迭代原理(Resilient Distributed Datasets)---弹性分布式数据集
Spark的核心RDD Resilient Distributed Datasets(弹性分布式数据集) Spark运行原理与RDD理论 Spark与MapReduce对比,MapReduce的计 ...
- DDoS(Distributed Denial of Service,分布式拒绝服务)
DDoS:Distributed Denial of Service,即分布式拒绝服务攻击. 借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高 ...
- Web Service实现分布式服务的基本原理
简单的说, 就是客户端根据WSDL 生成 SOAP 的请求消息, 通过 HTTP 传输方式(也可以是其它传输方式, 如 FTP 或STMP 等,目前 HTTP 传输方式已经成为 J2EE Web Se ...
- CassandraAppender - distributed logging,分布式软件logback-appender
农历年最后一场scala-meetup听刘颖分享专业软件开发经验,大受启发.突然意识到一直以来都没有完全按照任何标准的开发规范做事.诚然,在做技术调研和学习的过程中不会对规范操作有什么严格要求,一旦技 ...
- 共享内存Distributed Memory 与分布式内存Distributed Memory
我们经常说到的多核处理器,是指一个处理器(CPU)上有多个处理核心(CORE),共享内存多核系统我们可以将CPU想象为一个密封的包,在这个包内有多个互相连接的CORES,每个CORE共享一个主存,所有 ...
- [置顶]ABP框架系列总目录(持续更新)
Articles & Tutorials Introduction & Step by Step With ASP.NET Core & Entity Framework Co ...
- 【ABP框架系列学习】N层架构(3)
目录 0.引言 1.DDD分层 2.ABP应用构架模型 客户端应用程序(Client Applications) 表现层(Presentation Layer) 分布式服务层(Distributed ...
- ABP框架系列之三十九:(NLayer-Architecture-多层架构)
Introduction Layering of an application's codebase is a widely accepted technique to help reduce com ...
随机推荐
- 在Linux下配置jdk的环境变量
jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在根目录新建s ...
- 5-Qt读取文件失败原因
刚开始准备读取当前目录下的txt文件: QFile file(":/xuhao.txt");或者: QFile file("./xuhao.txt"); 但是一 ...
- php 函数中静态变量的问题
<?php function msg() { static $a = 0; echo $a++, '<br />'; } msg(); msg(); msg(); 上述代码,分别输出 ...
- struts框架值栈问题七之EL表达式也会获取到值栈中的数据
7. 问题七:为什么EL也能访问值栈中的数据? * StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(r ...
- 【D3D】Direct3D中LPRECT(上左右底)和LPoint(x,y)之前转换
D3DSprite.cpp void CD3DSprite::DrawText(CD3DFont *pFont, char *szString, RECT &DesRect, D3DCOLOR ...
- mysql 版本bug
mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by 在mysql 工具 搜索或者插入数据时报下面错误: ERR ...
- OpenGLES.APPLE_texture_format_BGRA8888
OpenGL ES的扩展: APPLE_texture_format_BGRA8888 http://www.khronos.org/registry/gles/extensions/APPLE/AP ...
- Codeforces 701C. They Are Everywhere 思路题
C. They Are Everywhere time limit per test: 2 seconds memory limit per test:256 megabytes input: sta ...
- OAuth 2.0 学习
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...
- nfs文件系统在linux下挂载不上的解决办法
标签: mount nfs export 2014年08月07日 18:46:247472人阅读 评论(0) 收藏 举报 分类: 文件系统(10) 版权声明:本文为博主原创文章,未经博主允许 ...