[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

简介: 原文:[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略.NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略   前言:之前的讨论一直关注在怎么从DAL中获取数据,以及数据的Mapping问题。
原文: [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

.NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

  前言:之前的讨论一直关注在怎么从DAL中获取数据,以及数据的Mapping问题。实际上,一个业务框架最主要的作用就是简化业务逻辑的编写和开发。

 

  本篇的议题如下:

    1. 框架的借鉴
    2. 综合考虑

 

  系列文章链接:

 [原创].NET 分布式架构开发实战之一 故事起源

[原创].NET 分布式架构开发实战之二 草稿设计

[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考

[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

[原创].NET 分布式架构开发实战五 Framework改进篇

[原创].NET 业务框架开发实战之六 DAL的重构

[原创].NET 业务框架开发实战之七 业务层初步构想

[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略

[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(前篇)

[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)

  1. 框架的借鉴

  一个框架的产生不是那么简单的,有很多的问题需要Richard去考虑:

    1. 避免重新造轮子
    2. 借鉴现有的成熟的框架的思想

 

在开发的过程中,Richard一直使用Visual Studio IDE开发。而且每次随着VS新版本的发布,总是伴随着新技术的产生。很多的时候,开发人员只是关注在新技术的使用和学习上。但是对于新技术,还有另外一方面是很值得关注的:实现的原理,和为什么这样实现,即,思想。新技术,毫无疑问是一些大师们思考的结果,从他们的思想中借鉴,益处是很大的。

 

Richard学习的过程中,有一个地方特别引起来他的关注:那就是依赖属性概念的提出,先是WPF,然后在他学习WF的时候,也看到了依赖属性的再次使用。他考虑,把依赖属性的思想使用到自己正在开发的业务框架中来。

 

首先,他分析了现在的依赖属性的实现方式(以WPF为例),

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
public   class  FrameworkElement: UIElement, ...

{

       
public   static   readonly  DependencyProperty MarginProperty;

       ...

}

 

public  Thickness Margin
{

       
set  { SetValue(MarginProperty, value); }

       
get  {  return  (Thickness)GetValue(MarginProperty); }

}

 

static  FrameworkElement()
{

       FrameworkPropertyMetadata metadata 
=   new  FrameworkPropertyMetadata(

              
new  Thickness(), FrameworkPropertyMetadataOptions.AffectsMeasure);

       MarginProperty 
=  DependencyProperty.Register( " Margin " ,

              
typeof (Thickness),  typeof (FrameworkElement), metadata,

              
new  ValidateValueCallback(FrameworkElement.IsMarginValid));   ...

}

 

 

Richard一直认为,一个属性的声明是很简单的,而且长期以来Richard都一直使用下面的方式:

 

public  Thickness Margin
{

       
get ; set ;

}

 

 

  比较而言,依赖属性最大的好处就于:给普通的属性提供更加多的信息,而且提供了更多的功能:验证,触发回调事件。当然,使用普通的属性也能达到:

  

public  Thickness Margin
{

       
get { return  margin;}
       
set
       {

              
if (margin < 0 )
                     ...
              ...
       }
}

 

 

相比而言,依赖的属性的方式更加优雅,而且扩展性也好。

 

还有一点比较重要的就是,一旦把一个属性变为依赖属性,那么.NET Framework就开始管理这个属性,如自动的验证,值的改变和跟踪。这样就把任务交给了Framework,开发人员做事情就比较方便了。

 

Richard想起了之前在开发业务类中遇到的问题:例如下面的代码:

 

public   class  Product
{

        
public   string  ProductName{ get ; set ;}

        
public   double  Price{ get ; set ;}

}

 

 

很多的时候,在增加或者更新一个Product的时候,由于逻辑的需要,往往要判断ProductName不为空,而且Price要大于零等。所以每次都需要写代码判断:

   

         public   void  Add()
        {

              
if ( string .IsNullOrEmpty( this .ProductName){...}

              
if ( this .Price < 0 ){...}

        }

 

 

  问题还不止这些,如果在其他的业务类中也需要同样,而且类似的验证,那只有一行行的写类似的代码,最好的情况就是copy一些代码。

 

       这样写代码确实很累,后面Richard也想用一些方式来改进,用到了Enterprise Library中的Validation验证模块,于是代码就变成了下面的样子:

 

 

public   class  Product
{

        [NotNullValidator]

        
public   string  ProductName{ get ; set ;} 

        
public   double  Price{ get ; set ;}    

}

 

 

使用声明的开发,AOP的思想,其实这样的方式相比之前而言,确实已经很不错了。在把业务类的数据保存的时候只要调用Validation验证模块的Validate()方法就行了。确实很方便,但是存在的问题就是:每次调用Validate()方法时候,就会把这个业务类的所有属性都会检查一遍(那些加了验证标签的属性),这样,性能方面不好,而且还不能针对某一个属性单独的验证。

 

  2. 综合考虑

Richard还考虑到了另外的一点:之前一直在解决mapping的问题,说到底就是把从DAL中拿到的数据赋值给业务类的属性。而且还要基于业务类创建查询对象,最后把查询对象解析为SQL语句,所以还要保存业务属性和DAL中数据实体属性的对应关系,即哪个业务属性对应哪个数据实体属性(也是表字段)。

 

综合上面的考虑,Richard决定把依赖属性的优势利用起来(自动的验证,数据改变跟踪,另外加上权限的验证),而且给依赖属性更多的元数据信息:把mapping的字段信息保存在依赖属性中。所以,现在属性的声明如下:

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
public   static   readonly  PropertyInfo < int >  ProductIdProperty  =  RegisterProperty < Product > (
            
new  PropertyInfo < int > ( " ProductId " , typeof (M_Product) " , " Id " )); 

    
public   string  ProductId
    {

      
get  {  return  ReadProperty(ProductIdProperty); }
      
set  { LoadProperty(ProductIdProperty, value); }
    }

 

 

在上面的属性声明中,就指定从业务类(如,Product)的属性从哪个数据实体(typeof(m_Product))的哪个属性(如,Id)取值。

RegisterProperty就是把属性的信息保存在一个字典中:

Dictionary<Type,List< IPropertyInfo>>

其中PropertyInfo继承了IPropertyInfo接口。

最后的结果就是:所有业务类的mapping属性都被保存在了一个全局的静态字典中。

 

另外还有一个全局的静态字典用来保存每个属性所对应的验证规则:

Dictionary< IPropertyInfo,List<ICheckRule>>

所有的验证规则都是从ICheckRule接口继承。

 

一个比较强大的属性就产生了。当然,在mapping属性中的验证只是基本的验证,还有更加复杂的业务验证将会放在其他的地方,实现方式或者类似WPF那么:采用回调,如new ValidateValueCallback(FrameworkElement.IsMarginValid)。

 

所以,借鉴于mapping属性就解决了三个问题:

    1. mapping和查询对象的实现
    2. 部分验证规则的声明
    3. 业务属性的管理

    版权为小洋和博客园所有,欢迎转载,转载请标明出处给作者。

     http://www.cnblogs.com/yanyangtian

 

  下篇讲述:.NET 业务框架开发实战之十 水到渠成,发布框架实现的第一个版本

 

目录
相关文章
|
22天前
|
开发框架 算法 Java
.NET 开发:实现高效能的秘诀
【7月更文挑战第4天】探索.NET高效开发涉及理解运行时(如GC、JIT)、代码与算法优化及工具利用。关键点包括适应性垃圾回收、异步编程、明智的并发控制;编写高效代码(避免对象创建,选对数据结构和算法);使用性能分析工具,善用高性能框架如ASP.NET Core,并借助云服务和CI/CD流程持续优化。性能优化是持续学习与实践的过程。
27 1
|
2月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
|
3天前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
1月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
43 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
22天前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
17 1
|
22天前
|
机器学习/深度学习 人工智能 开发者
.NET 技术:为开发带来新机遇
【7月更文挑战第4天】**.NET技术开启软件开发新篇章,通过跨平台革命(.NET Core, Xamarin, .NET MAUI)、云服务与微服务(Azure, DevOps, Docker)及AI集成(ML.NET, 认知服务, TensorFlow)为开发者创造新机遇。开源社区的繁荣与性能提升使.NET更具竞争力,推动智能应用的创新与发展。开发者需紧跟潮流,利用这些工具和框架构建高效、创新的解决方案。**
19 1
|
24天前
|
开发框架 JSON .NET
|
1月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
77 0
|
1月前
|
开发框架 JavaScript 前端开发
分享7个.NET开源、功能强大的快速开发框架
分享7个.NET开源、功能强大的快速开发框架
117 1
|
1月前
|
SQL JavaScript NoSQL
.NET有哪些好用的定时任务调度框架
.NET有哪些好用的定时任务调度框架