当前位置: 首页 > 编程日记 > 正文

一个简单实用的,基于EF的三层架构

      到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会太差.我觉的这样的框架,就是一个好的框架.而且,我觉的做框架,千万不能设计过度,不然会得不偿失.最关键要看你的业务场景,千万不要因为模式而模式,更多的看考虑它的实用性. 就像我接触的我们公司一个基于EF的三层,架构,我就觉得里面有一些不好的设计.主要表现如下.

  1. 每个类的一些基本的操作,如增加修改,删除.都是通过代码生成器生成的.其实我是很反对用代码生成器的.用代码生成的代码,就相当于我们在写代码中,进行复制黏贴.这个在我们设计上是很杜绝的. 我们以前做项目,都是不用代码生成器.用代码生成器,只会生成那个实体类.
  2. Bll层和DAL层,职责不分明.我看我做的那项目,写的代码比较乱.有些把业务层的东西,写在dal层. 这个也是框架的问题导致,因为bll层,没有事务,所以把事务里面的业务,也写在dal层里.同时有些人也为了方便,把访问数据的逻辑都放在bll层. 总之让人感觉很混乱.
  3. 是用IOC技术,把所有的bll层,dal层都是基于接口的方式去实现.到现在为止,我都觉的这个东西有点设计过度了.因为大部分项目,都不会去换dal层,bll层.如果硬要把所有的bll层,dal层都用IOC来做,会带来如下问题.(1) 我们想增加一个方法,经常要在4个地方写函数. (2)想用F12跟进去查看代码,是跟不进去的.只能跟到接口那里.  (3)最要命的就是它那个报错.经常会报配置错误,其实一查根本不是配置错误.只是生成的类有问题

  其实EF框架,还是很好用的,尤其在快速开发上,有不可替代的优势.而且性能上,我也做过压力测试,跟ado.net,差不了多少.因此,我就想开发一个基于EF的三层架构,请看下面的相关类图.
 

该框架,主要实现如下功能.

  1. 所有的dal层和bll层都有个基类,在基类里把所有的基本操作封装起来.
  2. 在dal层里,并没有真正的操作数据库,只是根据ef生成相应的语句,真正执行是在bll层里.
  3. 在bll层里有context对象,用来是控制bll层里的事务.
  4. Service层,是用来给外部提供系统调用的,可以是wcf,也可以webservice,也可以webapi 的方式.
  5. Web 层可的数据,可以来自bll层,也可以来自service层.(在案例中还没有实现)

  这框架的优点和缺点,我将下次再介绍,有兴趣的朋友,可以先下载代码来看看.同时也欢迎各位朋友评价这框架..

  下载路径  http://pan.baidu.com/share/link?shareid=464738&uk=3322219884 (demo是vs2012的,用其他版本打开可能会存在问题)

转载于:https://www.cnblogs.com/jake1/archive/2013/05/07/3065592.html

相关文章:

转:中国互联网十五年的22个创新模式

中国互联网十五年的22个创新模式 今天,看网上有人推荐《沸腾十五年》,讲中国互联网从发源到现今。 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什么会是他们出来了。他们的…

2018 蓝桥杯省赛 B 组模拟赛(一)-年龄

今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不…

C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件

今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的…

IPC--消息队列

消息队列的特点 消息队列是生命周期是随进程的,同时消息队列可以实现的是消息的传递方向是双向的。接受者和发送者时通过发送一个数据块来进性消息传递的,每个消息的数据类型不一样依次来进行区分我们该取哪个数据。消息队列是基于消息的,并…

sqlinesdata教程_如何将Oracle数据导入MySQL

Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全…

关于PHP.ini文件的设定

php.ini文件中记录了php的配置,因此正确读取此配置文件对于php的部署实施很重要。 windows平台中,有2种常用的方法。 第一种方法:把php.ini复制到c:\windows目录中。 第二种方法:配置apache服务器,在..\Apache Softwar…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…

poj 1523(无向联通图的割点)

结合tarjan算法思想,这题终于写了出来。 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候&#…

IPC--信号量

信号量概念理解 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。信号量的工作原理:两个进程…

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡

很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法

2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存

有了之前的学习经验&#xff0c;共享内存对我们学习起来相对简单一些了&#xff0c;这里简单说说共享内存的一些&#xff0c;然后对于函数的分析直接在代码里面的注释部分有说明&#xff0c;如果还是不懂&#xff0c;可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据

本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码&#xff0c;带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市&#xff1f;答&#xff1a;柳州市有5个区、5个县(行政区划2020年7月)。分别为&#xff1a;城中区、鱼峰区…

sql2000 转sql2008

1&#xff0c;在sql2008服务器上新建空数据库&#xff0c;与sql2000同名&#xff0c;当然可以不同名。 2&#xff0c;在sql2008服务器上选择数据库&#xff0c;点右键&#xff0c;任务-导入数据。打开导入数据向导。 3&#xff0c;点击下一步&#xff0c;选择数据源。数据源可以…

linux下查看网卡型号

查看网卡型号[rootcentos /]# lspci | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)我这里型号是79c970,驱动pcnet32.查看驱动信息[rootcentos /]# modinfo pcnet32filename: /lib/modules/2.6.18-194.el5/…

linux_域名映射

vi /etc/hosts在最后加上ip及映射的域名192.168.229.111 node001192.168.229.112 node002192.168.229.113 node003 转载于:https://www.cnblogs.com/lxyuuuuu/p/9578659.html

地址解析协议ARP

设计需求 ARP协议解决的问题就是&#xff1a;在同一个局域网中&#xff0c;解决主机IP地址和硬件地址的映射问题 基本使用原理 当数据在网络中某一条链路传输的时候我们知道目的主机的IP地址&#xff0c;但是不知道硬件地址&#xff0c;ARP协议就是解决这个问题的一个协议&a…

ie8加载js太慢_js ie8 慢

Re请教ap6214f2r版主一些问题引用第2楼ap6214f2r于2012-09-10 14:08发表的 :楼主&#xff0c;关于你说的慢&#xff0c;我去看了下你网站响应速度非常快[attachment26863]这个请求是计算签名&#xff0c;跳转到OSS的。.......老大&#xff0c;我刚才试了一下&#xff0c;不是线…

LINQ : IEnumerableT and IQueryableT区别

本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 下面这条语句使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 针对Linq “LINQ TO to OBJECTS”&#…

九大网络安全失误,需要注意

在我们的职业生涯中大都曾经有过一次这样的经历——我是说你认为足以让你丢掉饭碗的失误。我的第一次重大失误是曾经重启了校园里的所有路由器&#xff0c;不是一个接一个的&#xff0c;而是所有一次完成。我写了一个脚本&#xff0c;为所有的路由器安装一个安全更新&#xff0…

python学习笔记——Thread常用方法

http://blog.sina.com.cn/s/blog_4b5039210100ewie.html Thread对象中的一些方法&#xff1a; 以前说过多线程&#xff0c;用到threading模块中的Thread对象&#xff0c;其中的start和run方法比较熟悉了&#xff0c;start&#xff08;&#xff09;是重载了Thread对象中的run方法…

常见的路由选择算法

一、路由表 所谓路由表&#xff0c;指的是路由器或者其他互联网网络设备上存储的表&#xff0c;该表中存有到达特定网络终端的路径&#xff0c;在某些情况下&#xff0c;还有一些与这些路径相关的度量。 二、常见路由表生成算法 路由算法是提高路由协议功能&#xff0c;尽量…

linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

本嵌入式网络摄像机采用高性能ARM9芯片微处理器&#xff0c;内置嵌入式Web服务器。通过嵌入式多任务操作系统采集摄像机视频数据&#xff1b;采集的视频信号数字化后经MJPEG算法压缩&#xff0c;再通过内部总线送到内置的Web服务器&#xff1b;使用者可以直接用浏览器观看Web服…

2012 ARM嵌入式开发应用研讨会杂谈

记得以前参加的ARM的研讨会&#xff0c;名称是技术研讨会&#xff0c;不知道为什么现在改名为嵌入式开发应用研讨会了。不过今年演讲的重点就是 ARM DS-5开发工具&#xff08;还免费发放了一本《Linux/Android开发利器 ARM DS-5使用指南》书籍&#xff09;&#xff0c;也许这就…

打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

此文章参考《深入理解计算机系统》P31。 先看如下代码&#xff1a; 12345的十六进制表示为&#xff1a;0x00003039 1 #include <stdio.h>2 3 int main()4 {5 int a 12345;6 char *q (char *)(&a);7 for(int i 0; i < sizeof(a); i)8 prin…

NAT技术和代理服务器

一、代理服务器 所谓“代理”&#xff0c;就是代而劳之的意思。代理服务器就是代理网络用户去取得网络信息&#xff0c;形象的说&#xff1a;它是网络信息的中转站&#xff0c;使得一个网络终端和另一个网络终端不直接进行相连&#xff0c;代理网络用户去取得信息。主要工作在O…

链接全局变量再说BSS段的清理

废话就不多说了&#xff0c;开始。。。 再说BSS段的清算 以前遇到一个裸机程序不能改变全局变量值的问题&#xff0c;最后模模糊糊处理了&#xff1a;手动添加了一个链接脚本&#xff0c;清算了BSS段。问题得以处理&#xff0c;就认定是BSS段清算的问题&#xff0c;全局变量在B…

ios启动页尺寸_关于移动端App启动页的策划方案

App启动页是指app在启东时需要加载必要的运行环境和配置&#xff0c;在这个过程中提示用户等待的一个过渡页面。在产品经理眼里启动页是app给予用户重要的第一印象&#xff1b;也是App最重要的黄金页面之一&#xff0c;所有用户100%都会看到的页面。启动页适合用来做以下几个事…

事件流--事件冒泡现象及阻止

事件冒泡现象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件冒泡现象</title><style>div{padding: 50px;}#div1{background: red;}#div2{background: blue;}#div3{background: yell…