zoukankan      html  css  js  c++  java
  • 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
        }
    View Code

    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));
    
            }
    View Code

    Application.MainBoundedContext.DTO项目
    项目中是所有的DTO对象和使用AutoMapper转换的配置转换规则的Profile文件。
    这里的Profile文件是在Infrastructure(基础设施层)Crosscutting部分的Adapter(适配器)中AutomapperTypeAdapterFactory(AutoMapper的类型转换器创建工厂)创建AutomapperTypeAdapter(AutoMapper的类型转换器)时使用反射的方式调用的。

  • 相关阅读:
    HBaseTDG ClientAPI The Basics
    Hadoop TDG 3 – MR Features
    NoSQL Data Modeling Techniques
    配置SharePoint 2010的User Profile Synchronization连接到第三方的LDAP服务
    Failed to load data access DLL, 0x80004005
    如何开放HyperV服务的远程连接权限给别人?
    SharePoint 2010 Search 架构 已完工
    如何对SharePoint里OOB的JavaScript文件进行Debug 之一
    UPA Sync Service启动之后立即自动停止
    SharePoint 2010服务器场的防火墙需要开放哪些端口?
  • 原文地址:https://www.cnblogs.com/net-yuan/p/NLayerAppV3-Infrastructure_Application.html
Copyright © 2011-2022 走看看