目录:

前言

设计(完成扩展)

  实现效果

  扩展设计方案

  扩展后代码结构

集思广益(问题)

前言:

  在上一篇文章我写了如何重建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. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  2. HttpClient的替代者 - RestTemplate

    需要的包 ,除了Spring的基础包外还用到json的包,这里的数据传输使用json格式 客户端和服务端都用到一下的包 <!-- Spring --> <dependency> ...

  3. 3.Windows Server 2012 R2数据库部署

    很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...

  4. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  5. “fixed+relative==absolute”——对BFC的再次思考

    好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...

  6. Postman接口调试神器-Chrome浏览器插件

    首先大家可以去这个地址下载 Postman_v4.1.3 这个版本,我用的就是这个版本 http://chromecj.com/web-development/2014-09/60/download. ...

  7. iOS架构一个中型普通App的一些经验总结

    这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...

  8. C#项目中文件的具体含义

    1.Bin 目录 用来存放编译的结果,bin是二进制binary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin ...

  9. BPM公文管理解决方案分享

    一.方案概述 公文作为一种规范性文书,具有法律性.指导性.政令性强的特点,是企事业单位政令上通下达的重要方式.及时.准确.安全地处理.控制和管理公文,方能保障企事业单位正常运转,确保组织权威和政令畅通 ...

  10. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...