自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分享基于EF+WCF的通用三層架構(gòu)及解析

開發(fā) 架構(gòu)
本項目結(jié)合EF 4.3及WCF實現(xiàn)了經(jīng)典三層架構(gòu),各層面向接口,WCF實現(xiàn)SOA,Repository封裝調(diào)用,在此基礎(chǔ)上實現(xiàn)了WCFContext,動態(tài)服務(wù)調(diào)用及一個分頁的實例。

本項目結(jié)合EF 4.3及WCF實現(xiàn)了經(jīng)典三層架構(gòu),各層面向接口,WCF實現(xiàn)SOA,Repository封裝調(diào)用,在此基礎(chǔ)上實現(xiàn)了WCFContext,動態(tài)服務(wù)調(diào)用及一個分頁的實例。

1. 項目架構(gòu)圖:

 


2. 項目解決方案:

  • 在傳統(tǒng)的三層架構(gòu)上增加了WcfService(服務(wù)端),WcfClientProxy(客戶端服務(wù)調(diào)用),及WcfExtension(一些擴展)

 


 

3. Wcf Service的實現(xiàn):

  • 工廠實現(xiàn)了RemoteServiceFactory(用于遠(yuǎn)程調(diào)用)和RefServiceFactory(本地引用調(diào)用服務(wù)層)生成客戶端代理,都需要實現(xiàn)IServiceFactory的“IService CreateService();”
  • RemoteServiceFactory通過ChannelFactory動態(tài)產(chǎn)生客戶端代理類IService,并將此對象進(jìn)行緩存
  • WCFExtension實現(xiàn)了WCFContext,可傳輸用戶登陸或IP上下文信息,以及攔截方法寫Log的機制,具體可以參考 http://www.cnblogs.com/lovecindywang/archive/2012/03/01/2376144.html

3. 數(shù)據(jù)層Repository的實現(xiàn):

 

  • 通過用來訪問領(lǐng)域?qū)ο蟮囊粋€類似集合的接口,在領(lǐng)域與數(shù)據(jù)映射層之間進(jìn)行協(xié)調(diào),將領(lǐng)域模型從客戶代碼和數(shù)據(jù)映射層之間解耦出來,具體實現(xiàn)代碼:
  1. View Code   
  2.  public class DaoBase : IRepository, IDisposable  
  3.      {  
  4.          public DbContext context;  
  5.    
  6.          public DaoBase()  
  7.          {  
  8.              this.context = new EasyEF.DAL.DbContext();  
  9.          }  
  10.    
  11.          public T Update<T>(T entity) where T : class 
  12.          {  
  13.              var set = context.Set<T>();  
  14.              set.Attach(entity);  
  15.              context.Entry<T>(entity).State = EntityState.Modified;  
  16.              context.SaveChanges();  
  17.    
  18.              return entity;  
  19.          }  
  20.    
  21.          public T Insert<T>(T entity) where T : class 
  22.          {  
  23.              context.Set<T>().Add(entity);  
  24.              context.SaveChanges();  
  25.              return entity;  
  26.          }  
  27.    
  28.          public void Delete<T>(T entity) where T : class 
  29.          {  
  30.              context.Entry<T>(entity).State = EntityState.Deleted;  
  31.              context.SaveChanges();  
  32.          }  
  33.    
  34.          public T Find<T>(params object[] keyValues) where T : class 
  35.          {  
  36.              return context.Set<T>().Find(keyValues);  
  37.          }  
  38.    
  39.          public List<T> FindAll<T>(Expression<Func<T, bool>> conditions = null) where T : class 
  40.          {  
  41.              if (conditions == null)  
  42.                  return context.Set<T>().ToList();  
  43.              else 
  44.                  return context.Set<T>().Where(conditions).ToList();  
  45.          }  
  46.    
  47.          public PagedList<T> FindAllByPage<T, S>(Expression<Func<T, bool>> conditions, Expression<Func<T, S>> orderBy, int pageSize, int pageIndex) where T : class 
  48.          {  
  49.              var queryList = conditions == null ? context.Set<T>() : context.Set<T>().Where(conditions) as IQueryable<T>;  
  50.    
  51.              return queryList.OrderByDescending(orderBy).ToPagedList(pageIndex, pageSize);  
  52.          }  
  53.    
  54.          public void Dispose()  
  55.          {  
  56.              this.context.Dispose();  
  57.          } 

4. 數(shù)據(jù)層基于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.            
  10.          public DbSet<Category> Categories { getset; }  
  11.          public DbSet<Product> Products { getset; }  
  12.      } 

Model Mapping

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

5. 提供了MVC調(diào)用服務(wù)端分頁的實例:

  • MVC調(diào)用Wcf客戶代理請求分頁數(shù)據(jù)集合
  1. public ActionResult Index(int pageIndex  = 1)  
  2.         {  
  3.             var products = this.Service.GetProducts(PageSize, pageIndex);  
  4.             return View(products);  
  5.         } 
  • MVC附加用戶Context信息到服務(wù)端
  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信息并調(diào)用數(shù)據(jù)層
  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調(diào)用通用的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.    
  5.              return queryList.OrderByDescending(orderBy).ToPagedList(pageIndex, pageSize);  
  6.          } 

6. 最后提供源碼下

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

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

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2011-04-19 13:53:41

三層架構(gòu)

2009-07-28 17:25:14

ASP.NET三層結(jié)構(gòu)

2009-05-06 09:40:04

LINQWEB開發(fā)構(gòu)架

2009-07-28 17:18:33

2009-08-26 18:20:42

三層架構(gòu)

2013-01-09 11:00:20

架構(gòu)開發(fā)三層架構(gòu).NET架構(gòu)

2018-03-08 15:30:31

超融合架構(gòu)傳統(tǒng)三層架構(gòu)

2011-08-08 14:14:03

架構(gòu)

2010-01-11 16:26:42

三層交換機作用

2012-02-03 09:44:33

.NET

2010-01-28 15:29:52

三層交換機

2009-04-30 15:56:50

三層架構(gòu)MVCMVP

2009-07-28 15:08:50

MVC三層架構(gòu)實例

2015-07-02 10:57:11

General框架架構(gòu)開發(fā)

2018-10-31 14:32:53

數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)

2011-05-12 14:24:14

三層架構(gòu)

2012-07-16 10:19:02

MongoDB

2010-02-03 14:31:12

三層交換機

2010-02-07 14:55:33

第三層交換技術(shù)

2012-02-07 10:40:13

MVCJava
點贊
收藏

51CTO技術(shù)棧公眾號