为了账号安全,请及时绑定邮箱和手机立即绑定

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的类型转换器)时使用反射的方式调用的。

作者:net-yuan

原文出处:https://www.cnblogs.com/net-yuan/p/NLayerAppV3-Infrastructure_Application.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消