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是适配器工厂。
静态类,有两个方法,设置当前工厂和创建适配器的方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); }
--Localization 国际化
结构跟Adapter类似。
ILocalization定义了国际化的契约。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }
GetStringResource:根据key和CultureInfo获取value。
ILocalizationFactory是创建国际化的工厂。
LocalizationFactory是国际化的工厂。
有两个方法,创建当前国际化的工厂SetCurrent和创建当前资源的CreateLocalResources。
LocalizationKeys定义了资源的枚举。
--Validator 验证
结构跟Adapter类似。
IEntityValidator实体验证的契约。
包含两个方法:是否验证IsValid和获取验证信息集GetInvalidMessages。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <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;
IEntityValidatorFactory是实体验证工厂的契约。
定义了一个创建方法。
EntityValidatorFactory是实体验证工厂。
有两个方法,一个是设置当前工厂SetCurrent,另一个是创建验证器CreateValidator。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }
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