天天看點

NLayerAppV3--基礎結構層(Cross-Cutting部分)

回顧:NLayerAppV3是一個使用.net 2.1實作的經典DDD的分層架構的項目。

NLayerAppV3是在NLayerAppV2的基礎上,使用.net core2.1進行重新建構的;它包含了開發人員和架構師都可以重用的DDD層。

Github位址:https://github.com/cesarcastrocuba/nlayerappv3

NLayerAppV3的基礎結構層一共分為兩個部分。處理資料相關的基礎元件和Cross-Cutting的基礎元件。

處理資料相關的基礎元件主要包含UOW和倉儲的實作;

Cross-Cutting的基礎元件目前主要包含資料擴充卡、國際化、驗證;

本節我們主要介紹Cross-Cutting的基礎元件。

這部分相關的項目主要有兩個Infrastructure.Crosscutting和Infrastructure.Crosscutting.NetFramework。

Infrastructure.Crosscutting封裝了資料擴充卡、國際化、驗證相關的接口;

Infrastructure.Crosscutting.NetFramework包含了Infrastructure.Crosscutting中相關契約的實作;

1、Infrastructure.Crosscutting

--Adapter資料擴充卡

這部分是資料适配或者資料轉換的功能契約。

資料轉換是什麼?為什麼要資料轉換?

DTO:資料轉換對象。

資料轉換主要是用于将使用者的輸入轉換為DTO,在持久化的時候又将DTO轉為領域模型進行持久化;如果是使用者請求資料的話,則是相反的過程。

首先定義了一個類型轉換的契約ITypeAdapter。

接口中定義了類型轉換的方法,給我一個TSource,我還你一個TTarget。

TTarget Adapt<TSource, TTarget>(TSource source)
            where TTarget : class, new()
            where TSource : class;
      

ITypeAdapterFactory是擴充卡的工廠契約

ITypeAdapter Create();       

建立擴充卡,傳回擴充卡的契約。

TypeAdapterFactory是擴充卡工廠。

靜态類,有兩個方法,設定目前工廠和建立擴充卡的方法。

NLayerAppV3--基礎結構層(Cross-Cutting部分)
NLayerAppV3--基礎結構層(Cross-Cutting部分)
static ITypeAdapterFactory _currentTypeAdapterFactory = null;

        #endregion

        #region Public Static Methods

        /// <summary>
        /// Set the current type adapter factory
        /// </summary>
        /// <param name="adapterFactory">The adapter factory to set</param>
        public static void SetCurrent(ITypeAdapterFactory adapterFactory)
        {
            _currentTypeAdapterFactory = adapterFactory;
        }
        /// <summary>
        /// Create a new type adapter from currect factory
        /// </summary>
        /// <returns>Created type adapter</returns>
        public static ITypeAdapter CreateAdapter()
        {
            return _currentTypeAdapterFactory.Create();
        }      

View Code

--Localization 國際化

結構跟Adapter類似。

ILocalization定義了國際化的契約。

NLayerAppV3--基礎結構層(Cross-Cutting部分)
NLayerAppV3--基礎結構層(Cross-Cutting部分)
public interface ILocalization
    {
        string GetStringResource(string key);
        string GetStringResource(string key, CultureInfo culture);
        string GetStringResource<T>(T key) where T : struct, IConvertible;
        string GetStringResource<T>(T key, CultureInfo culture) where T : struct, IConvertible;
    }      

View Code

GetStringResource:根據key和CultureInfo擷取value。

ILocalizationFactory是建立國際化的工廠。

LocalizationFactory是國際化的工廠。

有兩個方法,建立目前國際化的工廠SetCurrent和建立目前資源的CreateLocalResources。

LocalizationKeys定義了資源的枚舉。

--Validator 驗證

結構跟Adapter類似。

IEntityValidator實體驗證的契約。

包含兩個方法:是否驗證IsValid和擷取驗證資訊集GetInvalidMessages。

NLayerAppV3--基礎結構層(Cross-Cutting部分)
NLayerAppV3--基礎結構層(Cross-Cutting部分)
/// <summary>
        /// Perform validation and return if the entity state is valid
        /// </summary>
        /// <typeparam name="TEntity">The type of entity to validate</typeparam>
        /// <param name="item">The instance to validate</param>
        /// <returns>True if entity state is valid</returns>
        bool IsValid<TEntity>(TEntity item)
            where TEntity : class;

        /// <summary>
        /// Return the collection of errors if entity state is not valid
        /// </summary>
        /// <typeparam name="TEntity">The type of entity</typeparam>
        /// <param name="item">The instance with validation errors</param>
        /// <returns>A collection of validation errors</returns>
        IEnumerable<String> GetInvalidMessages<TEntity>(TEntity item)
            where TEntity : class;      

View Code

IEntityValidatorFactory是實體驗證工廠的契約。

定義了一個建立方法。

EntityValidatorFactory是實體驗證工廠。

有兩個方法,一個是設定目前工廠SetCurrent,另一個是建立驗證器CreateValidator。

NLayerAppV3--基礎結構層(Cross-Cutting部分)
NLayerAppV3--基礎結構層(Cross-Cutting部分)
static IEntityValidatorFactory _factory = null;

        #endregion

        #region Public Methods

        /// <summary>
        /// Set the  log factory to use
        /// </summary>
        /// <param name="factory">Log factory to use</param>
        public static void SetCurrent(IEntityValidatorFactory factory)
        {
            _factory = factory;
        }

        /// <summary>
        /// Create the validator factory
        /// </summary>
        /// <returns></returns>
        public static IEntityValidator CreateValidator()
        {
            return (_factory != null) ? _factory.Create() : null;
        }      

View Code

2、Infrastructure.Crosscutting.NetFramework

--Adapter 資料擴充卡

使用AutoMapper庫實作了類型轉換擴充卡。

AutomapperTypeAdapter實作了ITypeAdapter,完成了源目标資料類型到時目标資料類型的轉換工作。

AutomapperTypeAdapterFactory實作了ITypeAdapterFactory。

在構造函數裡使用反射的方式,加載Application層中的Profiler檔案,實作類型轉換的配置。

Create方法傳回AutomapperTypeAdapter對象。

--Localization 國際化

ResourcesManager實作了ILocalization,完成了從資源檔案讀取資訊實作國際化。

ResourcesManagerFactory實作了ILocalizationFactory。

Create方法傳回了ResourcesManager對象。

Resources檔案夾下放的是資源檔案。

--Validator 驗證

DataAnnotationsEntityValidator實作了IEntityValidator。

使用System.ComponentModel.DataAnnotations驗證明體的正确性。

DataAnnotationsEntityValidatorFactory實作了IEntityValidatorFactory。

Create方法傳回了DataAnnotationsEntityValidator對象。

總結:NLayerAppV3項目的Infrastructure(基礎設施層)CrossCutting部分目前有三部分内容:擴充卡、國際化、驗證。

定義了擴充卡、國際化、驗證的契約以及它們的工廠;

實作了AutoMapper類型擴充卡、、國際化資源的擷取、System.ComponentModel.DataAnnotations方式的實體驗證。

參考:dax.net文章 https://www.cnblogs.com/daxnet/archive/2011/06/01/2067134.html