回顧: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 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