分享基于EF+WCF的通用三层架构及解析

本项目结合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

时间: 2024-10-12 16:24:41

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

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

http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统,且能作为代码实践及参考,欢迎提出意见. Demo预览 点击在线预览 admin/111111 请勿删数据 Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层的最基本的

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

原文来源:http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统,且能作为代码实践及参考,欢迎提出意见. Demo预览 点击在线预览 admin/111111 请勿删数据 Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层

校园视频管理系统----EF+WCF+MVC实现SOA架构

元旦开始做视频管理系统,从需求调研,设计原型图到实体设计到现在的搭建框架,收获了很多,在团队合作中学习,交流,实践.这次的合作开发应用了一种新的框架----EF+WCF+MVC灵活的实现经典三层架构.初步学习,先简单介绍一下,如下图 左侧红色部分是三层架构,右侧是结合MVC+WCF+EF框架实现SOA. SOA:面向服务架构(Service Oriented Architecture),它属于一种组件架构模型,W3C的定义:一组公开发表接口,并且提供查询的组件,具有4个特性,每个服务具有明确的边

.NET三层架构简单解析

对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想.这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章. 对于三层架构来说,就是使用类,把我们在做项目的过程中,可能需要反复操作数据库,反复的使用某个方法等等,可能就是操作的参数不同.如果我们如果在每次使用的时候,都去编写相应的代码,无疑会增加程序员的负担.所以,为了增加方法的重用,就把这些能够重用的方法抽象成类,以供程序员在其它地方可以调用. 当然了,这也是面向对象的一部分

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

http://www.cnblogs.com/darrenji/p/3809219.html 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用EF Code First创建领域模型和EF上下文■ 4.三层架构设计    □ 4.1 创建DAL层        ※ 4.1.1 MySportsStore.IDAL详解        ※ 4.1.2 MySportsStore.DAL详解 1.搭建项目 MySportsStore.

Asp.Net之三层架构

三层架构之理论: 通常意义上讲的三层架构就是将整个项目应用划分为:表现层(UI),业务逻辑层(BLL),数据访问层(DAL).与传统的二层架构的区别在于在用户界面(UI)和数据库服务器之间,添加中间层.而中间层又可划分为业务逻辑层(BLL),数据访问层(DAL)和数据对象模型层(Model).其中的数据对象模型层(Model)可以把表当做一个对象来处理,充分体现了面向对象的思想.三层架构因为"高内聚,低耦合"的特性,更利于 系统的设计和开发,同时为可能的变更提供了更小的单元,有利于系统

MVC项目实践,在三层架构下实现SportsStore-01

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用

三层架构和MVC

注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了. 这两个东西我接触有几年了,有一点体会,表达一下: 三层是三层,MVC是MVC,它们毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层)

Web项目的三层架构和MVC架构异同

http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了. 这两个东西我接触有几年了,有一点体会,表达一下: 三层是三层,MVC是MVC,它们毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层). 三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码