目录:

前言

设计(完成扩展)

  实现效果

  扩展设计方案

  扩展后代码结构

集思广益(问题)

前言:

  在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人、创建时间、更新人、更新时间的统一赋值。看起来会比较复杂,有人提到了重写SaveChanges来实现,这个是很好的建议,确实会更简单些。可我依旧要坚持在IDbCommandTreeInterceptor实现,具体原因吗?

  有一些系统要求对实体插入更新时,保存的创建时间、更新时间为数据库服务器时间(getdate()),关于让时间保存为数据库服务器时间一般有2种做法:

  1、从数据库服务器读取返回时间对实体进行赋值。

  2、在数据库创建时间上设置默认值,而更新时间则需要建立触发器。

  为什么需要存为数据库服务器时间:程序执行环境系统的时间可能和数据库服务器有差异,而这种差异在很多系统可能是致命的。一些桌面端应用(运行在用户电脑),没有设计服务层、客户端直接调用EF组件访问数据库,很不凑巧,有人就遇到这种系统。

  大概就是这样,如果要用我之前代码实现这个功能有两种可能性:

  1、修改扩展EntityFramework.SqlServer部分代码

  2、使IDbCommandTreeInterceptor、IDbCommandInterceptor两者在执行过程中建立关系,篡改DbCommand的CommandText、Parameters。

  其实两种实现方式我都不推荐,我还是使用第二种方式完成了这个实现,不过实际项目不推荐这么使用。

设计:

设计实现效果:

还是使用原有的配置

扩展设计方案:

我在昨天的思维导图里提示了IGetDbExpression接口为什么要耦合到DbExpression,其实就是为了在不修改SimpleSSOCommandTreeInterceptor情况下完成这个另类功能的实现,让SimpleSSOCommandTreeInterceptor承当更少的职责。

代码结构(类型之间的依赖关系):

右上角为新增的两个类,如果扩展IntercepterGeneratedType则需要调整右上角两个类及IGetDbExpression实现。

大概就是这样,对于EF,我也有两年没怎么用了。之前一直在追求许多技术上的最佳实践,对于系统技术的复杂度可以说是恒定的,可是系统的复杂度随着业务的扩展有时候是呈指数级增长的。这两年去一些大型电商公司、制造企业了解学习他们的业务,技术相对落后,中途改造了许多庞大且设计异常糟糕的系统,问题基本都是线上的,情况就是你们IT部门大部分人每天几十个人找,总的说来这两年还是收获颇丰的。

集思广益:

之前公司有使用到网上找到的自建数据库函数fun_split,这个函数执行结果没有问题,不过更严重的就是,当@input参数字符达到一定长度,随着长度增加,执行时间可以说呈指数级别的增长。

代码:

create function fun_split(@input varchar(max),@pattern varchar())
returns @temp table(a varchar())
--实现split功能 的函数
--说明:@input,字符串,如a:b:c;@pattern,分隔标志,如 :
as
begin
declare @i int
set @input=rtrim(ltrim(@input))
set @i=charindex(@pattern,@input)
while @i>=
begin
insert @temp values(left(@input,@i-))
set @input=substring(@input,@i+,len(@input)-@i)
set @i=charindex(@pattern,@input)
end
if @input<>''
insert @temp values(@input)
return
end

如何修改调整这段代码完成优化,有兴趣的朋友可以看下,有点意思。

通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)的更多相关文章

  1. spring自定义注解实现登陆拦截器

    1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...

  2. 全新升级的AOP框架Dora.Interception[3]: 基于特性标注的拦截器注册方式

    在Dora.Interception(github地址,觉得不错不妨给一颗星)中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上.本篇文章介绍最常用的基于"特性标注"的拦截 ...

  3. Spring实现自定义注解并且配置拦截器进行拦截

    有时候我们会自定义注解,并且需要配置拦截器对请求方法含有该自定义注解的方法进行拦截操作 自定义注解类 NeedToken.java import java.lang.annotation.Docume ...

  4. OkHttp3 拦截器源码分析

    OkHttp 拦截器流程源码分析 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机 ...

  5. 12.Struts2自定义拦截器

    12.自定义拦截器        拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...

  6. 5、Struts2自定义拦截器

    一.拦截器相关知识 1.Struts2框架剖析 Holly版本生活案例: 影视公司(拍电影)    ActionMapper 传媒公司(包装明星) ActionMapping 明星           ...

  7. JavaEE开发之SpringMVC中的自定义拦截器及异常处理

    上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...

  8. JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

    一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implemen ...

  9. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

随机推荐

  1. 先说IEnumerable,我们每天用的foreach你真的懂它吗?

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  2. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  3. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  4. C#中如何在Excel工作表创建混合型图表

    在进行图表分析的时候,我们可能需要在一张图表呈现两个或多个样式的图表,以便更加清晰.直观地查看不同的数据大小和变化趋势.在这篇文章中,我将分享C#中如何在一张图表中创建不同的图表类型,其中包括如何在同 ...

  5. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  6. JavaScript实现DOM对象选择器

    目的: 根据传入的选择器类型选出第一个符合的DOM对象. ①可以通过id获取DOM对象,例如 $("#adom"); ②可以通过tagName获取DOM对象,例如 $(" ...

  7. React Native环境配置之Windows版本搭建

    接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...

  8. maven 快照

    大型应用软件一般由多个模块组成,一般它是多个团队开发同一个应用程序的不同模块,这是比较常见的场景.例如,一个团队正在对应用程序的应用程序,用户界面项目(app-ui.jar:1.0) 的前端进行开发, ...

  9. Mysql - 数据库操作

    之前介绍了数据库的增删改查, 发现忘记了数据库的一些基本操作, 比如建库, 建表, 改表等等. 那这里就来小结一下数据库sql形式的基本操作. 一.库操作 1. 建库 在建库之前, 可能需要看一下, ...

  10. linux常用查看硬件设备信息命令

    转载:http://blog.chinaunix.net/uid-26782198-id-3242120.html # uname -a               # 查看内核/操作系统/CPU信息 ...