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是介面卡工廠。
靜態類,有兩個方法,設定當前工廠和建立介面卡的方法。
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定義了國際化的契約。
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。
/// <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。
static IEntityValidatorFactory _factory = null; #endregion #region Public Methods /// <summary> /// Set thelog 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