本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例。

1. 项目架构图:

2. 项目解决方案:

  • 在传统的三层架构上增加了WcfService(服务端),WcfClientProxy(客户端服务调用),及WcfExtension(一些扩展)

3. Wcf Service的实现:

  • 工厂实现了RemoteServiceFactory(用于远程调用)和RefServiceFactory(本地引用调用服务层)生成客户端代理,都需要实现IServiceFactory的"IService CreateService();"
  • RemoteServiceFactory通过ChannelFactory动态产生客户端代理类IService,并将此对象进行缓存
  • WCFExtension实现了WCFContext,可传输用户登陆或IP上下文信息,以及拦截方法写Log的机制,具体可以参考http://www.cnblogs.com/lovecindywang/archive/2012/03/01/2376144.html

3. 数据层Repository的实现:

  • 通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调,将领域模型从客户代码和数据映射层之间解耦出来,具体实现代码:
  1. View Code
  2. public class DaoBase : IRepository, IDisposable
  3. {
  4. public DbContext context;
  5. public DaoBase()
  6. {
  7. this.context = new EasyEF.DAL.DbContext();
  8. }
  9. public T Update<T>(T entity) where T : class
  10. {
  11. var set = context.Set<T>();
  12. set.Attach(entity);
  13. context.Entry<T>(entity).State = EntityState.Modified;
  14. context.SaveChanges();
  15. return entity;
  16. }
  17. public T Insert<T>(T entity) where T : class
  18. {
  19. context.Set<T>().Add(entity);
  20. context.SaveChanges();
  21. return entity;
  22. }
  23. public void Delete<T>(T entity) where T : class
  24. {
  25. context.Entry<T>(entity).State = EntityState.Deleted;
  26. context.SaveChanges();
  27. }
  28. public T Find<T>(params object[] keyValues) where T : class
  29. {
  30. return context.Set<T>().Find(keyValues);
  31. }
  32. public List<T> FindAll<T>(Expression<Func<T, bool>> conditions = null) where T : class
  33. {
  34. if (conditions == null)
  35. return context.Set<T>().ToList();
  36. else
  37. return context.Set<T>().Where(conditions).ToList();
  38. }
  39. public PagedList<T> FindAllByPage<T, S>(Expression<Func<T, bool>> conditions, Expression<Func<T, S>> orderBy, int pageSize, int pageIndex) where T : class
  40. {
  41. var queryList = conditions == null ? context.Set<T>() : context.Set<T>().Where(conditions) as IQueryable<T>;
  42. return queryList.OrderByDescending(orderBy).ToPagedList(pageIndex, pageSize);
  43. }
  44. public void Dispose()
  45. {
  46. this.context.Dispose();
  47. }

4. 数据层基于Entity Framwork code First:

DBContext

  1. View Code
  2. public class DbContext : System.Data.Entity.DbContext
  3. {
  4. public DbContext()
  5. base("MyDbContext")
  6. {
  7. this.Configuration.ProxyCreationEnabled = false;
  8. }
  9. public DbSet<Category> Categories { getset; }
  10. public DbSet<Product> Products { getset; }
  11. }

Model Mapping

  1. View Code
  2. [Table("Product")]
  3. public partial class Product
  4. {
  5. public int Id { get; set; }
  6. [StringLength(50)]
  7. [Required(ErrorMessage = "名称不能为空")]
  8. public string Name { get; set; }
  9. public int Size { get; set; }
  10. [StringLength(300)]
  11. public string PhotoUrl { get; set; }
  12. public DateTime AddTime { get; set; }
  13. public int CategoryId { get; set; }
  14. public virtual Category Category { get; set; }
  15. }

5. 提供了MVC调用服务端分页的实例:

  • MVC调用Wcf客户代理请求分页数据集合
  1. public ActionResult Index(int pageIndex  = 1)
  2. {
  3. var products = this.Service.GetProducts(PageSize, pageIndex);
  4. return View(products);
  5. }
  • MVC附加用户Context信息到服务端
  1. protected override void OnActionExecuting(ActionExecutingContext filterContext)
  2. {
  3. base.OnActionExecuting(filterContext);
  4. WCFContext.Current.Operater = new Operater(){Name = "guozili",Time = DateTime.Now,IP = Fetch.UserIp,};
  5. }
  • BLL取出Context信息并调用数据层
  1. public PagedList<Product> GetProducts(int pageSize, int pageIndex, int categoryId = 0)
  2. {
  3. //Test WCFContext
  4. var context = WCFContext.Current.Operater;
  5. return this.dao.FindAllByPage<Product, int>(p => categoryId == 0 ? true : p.CategoryId == categoryId, p => p.Id, pageSize, pageIndex);
  6. }
  • DAL调用通用的Repository接口
  1. public PagedList<T> FindAllByPage<T, S>(Expression<Func<T, bool>> conditions, Expression<Func<T, S>> orderBy, int pageSize, int pageIndex) where T : class
  2. {
  3. var queryList = conditions == null ? context.Set<T>() : context.Set<T>().Where(conditions) as IQueryable<T>;
  4. return queryList.OrderByDescending(orderBy).ToPagedList(pageIndex, pageSize);
  5. }

6. 最后提供源码下

http://files.cnblogs.com/guozili/EasyEF.rar

原文链接:http://www.cnblogs.com/guozili/archive/2012/09/03/2667429.html

分享基于EF+WCF的通用三层架构及解析的更多相关文章

  1. 基于EF+WCF的通用三层架构及解析

    分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...

  2. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构

      基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业 ...

  3. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构(转)

    http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通 ...

  4. .NETCore+EF+MySql+Autofac简单三层架构

    前言 其实就是一个简单依赖注入的三层架构.记录一下,大佬们就不用看下去了.重点在最后面,可以直接拖到底去看. 正文 1.贴代码 1.整体的一个结构.大佬们应该一眼就看明白了. 2.MySqlConte ...

  5. 【ASP.NET开发】.NET三层架构简单解析

    对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想.这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章. 对于三层架 ...

  6. 分享基于分布式Http长连接框架--架构模型

    我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...

  7. 基于EF+MVC+Bootstrap的通用后台管理系统及架构

    分享基于EF+MVC+Bootstrap的通用后台管理系统及架构 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. 如何使用ABP进行软件开发(2) 领域驱动设计和三层架构的对比

    简述 上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO,应用服务层,整洁架构,领域对象(如实体,聚合,值对象)等. 笔者也曾经提到,AB ...

随机推荐

  1. topcoder srm 510 div1

    problem1 link 令$f(x)$表示[0,x]中答案的个数.那么题目的答案为$f(b)-f(a-1)$ 对于$f(x)$来说,假设$x$有$d$位数字,即$[0,d-1]$,那么可以进行动态 ...

  2. SQL 基础语法笔记教程整理

    最近从图书馆借了本介绍 SQL 的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用 SQL Server2008 语法. 首先,附一个发现的 MySQL 读书笔 ...

  3. 【团队】EasyKing的实现_1

    完成部分 三个功能类 英雄. 子弹. 瓦片地图. 一个设置类 地图 实现功能 瓦片地图 英雄移动 攻击 受到攻击 TODO 子弹攻击范围 地图.建筑物和英雄的碰撞箱 音效 英雄技能 建筑 双人联机 物 ...

  4. Java基础 【类之间的关系】

    在Java与其他面向对象设计语言中,类之间常见的关系有6种 分别是:  依赖.关联.聚合.组合.继承.实现,他们的耦合度依次增强. 其中,关联.聚合.组合关系仅仅是在语义上有所区别,所谓语义就是指上下 ...

  5. HDU-6033 Add More Zero

    There is a youngster known for amateur propositions concerning several mathematical hard problems. N ...

  6. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  7. 4、python内置类型(0529)

    支持运算:索引,切片,min(), max(), len()等 支持操作:对象的自有的方法 对字符串操作的内置方法获取:str.     //敲tab键补全 获取某个内建命令的属性和方法列表:dir( ...

  8. HDU 5242 Game(贪心)

    http://acm.hdu.edu.cn/showproblem.php?pid=5242 题意: 给出一棵树,每个节点都有一个权值,每次可以获得从根结点(1)到叶子节点上的所有权值和,每个节点只能 ...

  9. HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...

  10. Python open 对应的参数