NLayerAppV3-Infrastructure(基础结构层)的Data部分和Application(应用层)
回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目。
NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的;它包含了开发人员和架构师都可以重用的DDD层。
Github地址:https://github.com/cesarcastrocuba/nlayerappv3
NLayerAppV3的基础结构层一共分为两个部分。处理数据相关的基础组件和Cross-Cutting的基础组件。
处理数据相关的基础组件主要包含UOW和仓储的实现;
Cross-Cutting的基础组件目前主要包含数据适配器、国际化、验证;
本篇介绍NLayerAppV3的Infrastructure(基础结构层)的Data部分和Application(应用层)
1、Infrastructure(基础结构层)的Data部分
Data部分是处理数据相关的基础组件主要包含UOW和仓储的实现。
UOW的实现:BaseContext继承了DbContext和IQueryableUnitOfWork
DbContext是EF Core数据库上下文,包Microsoft.EntityFrameworkCore
IQueryableUnitOfWork继承IUnitOfWork和ISql,是EF Core方式的契约定义
Isql定义了支持sql语句的方式
Repository仓储的层超类型,通过构造函数注入了IQueryableUnitOfWork和ILogger,定义了EF Core方式的CURD以及查询过滤,包括分页等行为
MainBCUnitOfWork实现了BaseContext。示例使用内存数据库的方式来演示,当然,根据实际需要,可以很容易地扩展使用sqlserver、mysql、sqlite等,这也符合了开闭原则
BankAccountRepository是BankAccount仓储,继承Repository<BankAccount>,IBankAccountRepository,通过构造函数注入了MainBCUnitOfWork和ILogger,提供了一个GetAll方法,用来获取BankAccount的集合。
public class BankAccountRepository
:Repository<BankAccount>,IBankAccountRepository
{
#region Constructor /// <summary>
/// Create a new instance
/// </summary>
/// <param name="unitOfWork">Associated unit of work</param>
/// <param name="logger">Logger</param>
public BankAccountRepository(MainBCUnitOfWork unitOfWork,
ILogger<Repository<BankAccount>> logger)
: base(unitOfWork, logger)
{ } #endregion #region Overrides /// <summary>
/// Get all bank accounts and the customer information
/// </summary>
/// <returns>Enumerable collection of bank accounts</returns>
public override IEnumerable<BankAccount> GetAll()
{
var currentUnitOfWork = this.UnitOfWork as MainBCUnitOfWork; var set = currentUnitOfWork.CreateSet<BankAccount>(); return set.Include(ba => ba.Customer)
.AsEnumerable(); }
#endregion
}
2、Application(应用层)
协调领域模型与其它应用、包括事务调度、UOW、数据转换等。
IService定义了应用层服务的契约。Service实现了IService,通过构造函数注入IRepository,为什么要注入IRepository?
因为要获取实体的相关信息,就必须通过仓储去操作聚合,而聚合是通过聚合根跟外部联系的。
ProjectionsExtensionMethods作用是使用扩展方法,将实体转换为DTO或者将实体集合转换为DTO的集合
IBankAppService定义了Bank的应用层契约。有开户、查找账户、锁定账户、查找账户活动集、转账等业务。
BankAppService实现了IBankAppService。通过构造函数注入IBankAccountRepository、ICustomerRepository、IBankTransferService、ILogger。
IBankAccountRepository是BankAccount的仓储契约;
ICustomerRepository是Customer用户的仓储契约;
IBankTransferService是转账的领域服务;
转账方法的代码:
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)); }
Application.MainBoundedContext.DTO项目
项目中是所有的DTO对象和使用AutoMapper转换的配置转换规则的Profile文件。
这里的Profile文件是在Infrastructure(基础设施层)Crosscutting部分的Adapter(适配器)中AutomapperTypeAdapterFactory(AutoMapper的类型转换器创建工厂)创建AutomapperTypeAdapter(AutoMapper的类型转换器)时使用反射的方式调用的。
NLayerAppV3-Infrastructure(基础结构层)的Data部分和Application(应用层)的更多相关文章
- Enterprise Library - Data Access Application Block 6.0.1304
Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...
- Pass Infrastructure基础架构(下)
Pass Infrastructure基础架构(下) pass注册 PassRegistration该类在示例中简要显示了各种pass类型的定义 .该机制允许注册pass类,以便可以在文本pass管 ...
- Pass Infrastructure基础架构(上)
Pass Infrastructure基础架构(上) Operation Pass OperationPass : Op-Specific OperationPass : Op-Agnostic De ...
- sql基础之DDL(Data Definition Languages)
好久没写SQL语句了,复习一下. DDL数据定义语言,DDL定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.经常使用的DDL语句包含create.drop.alter等等. 登录数据:my ...
- NLayerAppV3--基础结构层(Cross-Cutting部分)
回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...
- (转)EntityFramework之领域驱动设计实践
EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...
- EntityFramework之领域驱动设计实践
EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...
- 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)
前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...
随机推荐
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- 运行php网站需要安装什么
php的运行环境: 为了能够运行php,有以下两种方法: 1. 使用支持php和MySQL的web主机(): 2. 本机(自己电脑)安装web服务器,然后安装MySQL和php. web虚拟主机: 大 ...
- 使用UltraISO制作光盘镜像
为什么使用光盘镜像文件: 1. 有些光盘中的内容必须在光盘运行环境中运行: 有些光盘的内容要在光盘运行的时候才能运行,即使你安装到电脑上都不行!例如某些游戏光盘等,这样就得每次使用时都要用光盘,对光驱 ...
- python的线程锁
1.先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存 import threading import time num = 100 thread_lock = threading.L ...
- centos7.5配置双网卡上网
一.环境及说明 当初有这个需求,主要是帮一个高校的客户搭建一个大数据集群,使用的是校园网,交换机上一个端口只能连接一部电脑上网,不能通过路由组建子网,确保集群中的服务器有子网ip的同时,也能够通过公网 ...
- Ubuntu --- not enough free disk space
Ubuntu系统更新时出现not enough free disk space. 原因是系统的就内核占满了/boot 的空间,只要将旧内核删除就ok了 首先,命令 uname -r 查看当前内核,( ...
- win 下 apache 实现负载均衡
1.打开apache的配置文件httpd.conf,打开如下项 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_mo ...
- PL/Sql快速执行 insert语句的.sql文件
当全是 insert语句的.sql文件太大时(insert 语句条数太大),直接打开执行sql文件,pl/sql会卡死. 这是可以用pl/sql的命令窗口来执行.sql文件,操作步骤如下: 1.新建命 ...
- 解决ios手机页面overflow scroll滑动很卡的问题
在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 要解决这个问题很简单: 一行代码搞定 -webkit-ov ...
- Object类中通用方法之:toString()方法
1.Java所有的对象都是Object类的实例,都可以直接调用该类中定义的方法,这些方法称为通用方法 2.toString()方法即为Object类中定义的通用方法之一 3.平时我们如果在控制台直接打 ...