动态构建应用程序
今年2017年8月进入律所行业,精细化管理和业务流成为现在主要开发方向,目前采用的技术是以数据为核心的ado三层架构的web MVC erp系统开发,我们现将数据访问层改为dapper。它有一下特点:
1.T-SQL产生的数据模型与业务模型、数据传输模型公用一个,界面需要什么,模型层就加什么。
2.业务层代码主要调用DAL层,一部分SQL拼接放在业务层。
3.MVC采用ViewBag做数据传输,最经典的案例是形成动态表单,该功能由三个表组成,通过存储过程驱动数据,所有动态表单数据都保存在这里。
优点:业务快速扩张,直接调用已建立好的模块实现对应功能。
缺点:业务层过于厚重,代码耦合严重,检查和修改的时候比较费力。模型与实体合为一个,代码检查和修改严重依赖DAL层SQL语句。
现有系统的优势在于基于动态表单的扩展迅速。
劣势在于统计复杂,数据迁移尤其复杂。
对于现有系统开发的难点在于,理清数据与业务关系,对现有系统中每个业务必须达到知根知底,盲人摸象都没办法进行功能开发。
基于以上,我考虑将系统中业务逻辑进行整理,并整理相关SQL语句,将SQL语句存库。通过存储过程的方式动态调用与执行。这里面涉及一下内容:
- 动态模型生成与管理。包括SearchDTO,EntityModel。(测试成功)
- 动态生成SQL语句并管理。SQL语句采用存储过程实现。(测试成功)
- 将以上两个功能存库,建立逻辑关系,对其进行管理和分析。(测试成功)
- 动态调用SqlConnection或者Dapper。(测试成功)
- 依靠以上功能调用,并建立项目。
开发该功能分为三个阶段:
一、动态构建DAL层并存库管理。
二、动态构建业务并存库管理。
三、建立web项目。
目前实现功能:
- 动态模型的建立、赋值和管理。
- 根据动态模型生成SQL语句并保存为存储过程。(存储过程能够实现条件动态拼接),构建SQL如下:
USE [test] GO /****** Object: StoredProcedure [dbo].[pr_GetATest] Script Date: 2017/12/8 15:52:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[pr_GetATest] ( @ID int, @Name varchar(200), @Code varchar(200), @Number DECIMAL ) as begin set nocount on; DECLARE @Param NVARCHAR(MAX) = N'',@sqlcommand NVARCHAR(MAX) = N'' SET @sqlcommand ='SELECT ID , Name , Code , Number FROM dbo.ATest where 1=1 ' IF(@ID IS NOT NULL AND @ID!=0) SET @sqlcommand = CONCAT(@sqlcommand,' AND ID= @IDS ') IF(@Name IS NOT NULL AND @Name!='') SET @sqlcommand = CONCAT(@sqlcommand,' AND Name= @NameS ') IF(@Code IS NOT NULL) SET @sqlcommand = CONCAT(@sqlcommand,' AND Code=@CodeS ') IF(@Number IS NOT NULL) SET @sqlcommand = CONCAT(@sqlcommand,' AND Number=@NumberS ') SET @Param= '@IDS int, @NameS varchar(200), @CodeS varchar(200), @NumberS DECIMAL ' PRINT @sqlcommand EXEC sp_executesql @sqlcommand,@Param, @IDS = @ID , @NameS = @Name , @CodeS = @Code , @NumberS = @Number END
中午一小时,继续进行中