目录:

前言

设计(完成扩展)

  实现效果

  扩展设计方案

  扩展后代码结构

集思广益(问题)

前言:

  在上一篇文章我写了如何重建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. 【.net 深呼吸】细说CodeDom(8):分支与循环

    有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...

  2. 逆天Kali带你游遍大江南北~安全之前人铺路!

    0.Linux基础学习(基本指令) http://www.cnblogs.com/dunitian/p/4822807.html 1.Kali安装到移动硬盘或者U盘中~Linux系列通用方法(包括An ...

  3. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  4. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  5. 关于VS2015 ASP.NET MVC添加控制器的时候报错

    调试环境:VS2015 数据库Mysql  WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...

  6. 零OCR基础6行代码实现C#验证码识别

    这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...

  7. 如何区别数据库删除语句drop与delete与truncate?

    1.delete:删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行) 删除某一行:delete from 数据表名称 where 列名称=值: 删除所有行:delete*fro ...

  8. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系

    .Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...

  9. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  10. 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题

    使用Indy来发邮件坑不少啊,只不过有比没有好吧,使用delphi6这种老工具没办法,只能使用了新一点的Indy版本9,公司限制... 1.邮件包含TIdText和TIdAttachment时会出现T ...