回顾: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(应用层)的更多相关文章

  1. Enterprise Library - Data Access Application Block 6.0.1304

    Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简 ...

  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...

  3. Pass Infrastructure基础架构(下)

    Pass Infrastructure基础架构(下) pass注册  PassRegistration该类在示例中简要显示了各种pass类型的定义 .该机制允许注册pass类,以便可以在文本pass管 ...

  4. Pass Infrastructure基础架构(上)

    Pass Infrastructure基础架构(上) Operation Pass OperationPass : Op-Specific OperationPass : Op-Agnostic De ...

  5. sql基础之DDL(Data Definition Languages)

    好久没写SQL语句了,复习一下. DDL数据定义语言,DDL定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.经常使用的DDL语句包含create.drop.alter等等. 登录数据:my ...

  6. NLayerAppV3--基础结构层(Cross-Cutting部分)

    回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...

  7. (转)EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  8. EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  9. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

随机推荐

  1. 人机大战中AlphaGo及其执子人黄士杰

    2016年3月9日注定要写入围棋界的历史.IT界的历史以及科学界的历史.当天,韩国著名围棋棋手李世石VS谷歌AlphaGo的人机大战赛在韩国首尔举行.对弈的一方为拥有1200多个处理器的谷歌人工智能系 ...

  2. AtomEye的使用

    网易博客粗略地在转载的基础上对AtomEye补充了概述: AtomEye: Atomistic configuration viewer developed by J. Li. This progra ...

  3. The valid characters are defined in RFC 7230 and RFC 3986

    网上大都说什么发送格式与协议定义的不兼容,改tomcat版本或改编码之类的. 本人测试的时候换了个浏览器,不用IE就好了 如果坚持用ie,也有解决方式 @参考文章 成功的方法 在请求地址var url ...

  4. 121. Best Time to Buy and Sell Stock买卖股票12

    一 [抄题]: If you were only permitted to complete at most one transaction (ie, buy one and sell one sha ...

  5. Ruby环境配置

    一.rvm 1.简介 rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. 2.安装步骤 1.新建文件:rvm-installer.sh vi rvm-installer.sh ...

  6. PAT 1054 求平均值 (20)(代码+思路+测试用例)

    1054 求平均值 (20)(20 分) 本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输入是[-1000,1000]区 ...

  7. geoserver 开发2

    先上源码下载 上一章我们介绍了GeoServer源码分析的必要性(这个就见仁见智了)以及诸项准备工作,并且在最后还给出了OWS请求处理流程的伪代码. 这一章我们来看看要注册自己的服务需要做哪些工作.假 ...

  8. Luugu 3084 [USACO13OPEN]照片Photo

    很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一 ...

  9. [Selenium] jsclick

    SeleniumUtil.jsClick(driver, saveButtonEl);

  10. jquery ui中的dialog,官网上经典的例子

    jquery ui中的dialog,官网上经典的例子   jquery ui中dialog和easy ui中的dialog很像,但是最近用到的时候全然没有印象,一段时间不用就忘记了,这篇随笔介绍一下这 ...