文章出處
View Code
文章列表
使用了4年的IRepository數據倉儲接口,今天要改變了,對于這個數據倉儲操作接口,它提倡的是簡潔,單純,就是對數據上下文的操作,而直正的數據上下文本身我們卻把它忽略了,在我的IRepository接口里根本沒有數據上下文對象,這是不完整的,也許你會說,我使用了基類,數據基類里有數據上下文,是的,我也是那樣用的,但有時,這種方法有些死板了,真的,當你碰到IOC時,這種方式的短板就出來了,即,每個反射出來的Repository對象都是獨立的,每個對象里的上下文也都是獨立的,這是重點,由于上下文是獨立的,所以,很多事我們都沒法干,這包括<JOIN關聯查詢,非MSDTC的事務>,看了上面的這么多原因,所以,才決定,擴展我的IRepository接口,當然,嚴格說,這違背了面向對象的原則,接口不提倡擴展,只提倡新建,呵呵.
全新的IRepository接口

/// <summary> /// 基礎的數據操作規范 /// </summary> /// <typeparam name="TEntity"></typeparam> public interface IRepository<TEntity> where TEntity : class { /// <summary> /// 設定數據上下文,它一般由構架方法注入 /// </summary> /// <param name="unitOfWork"></param> void SetDbContext(IUnitOfWork unitOfWork); /// <summary> /// 添加實體并提交到數據服務器 /// </summary> /// <param name="item">Item to add to repository</param> void Insert(TEntity item); /// <summary> /// 移除實體并提交到數據服務器 /// 如果表存在約束,需要先刪除子表信息 /// </summary> /// <param name="item">Item to delete</param> void Delete(TEntity item); /// <summary> /// 修改實體并提交到數據服務器 /// </summary> /// <param name="item"></param> void Update(TEntity item); /// <summary> /// 得到指定的實體集合(延時結果集) /// Get all elements of type {T} in repository /// </summary> /// <returns>List of selected elements</returns> IQueryable<TEntity> GetModel(); /// <summary> /// 根據主鍵得到實體 /// </summary> /// <param name="id"></param> /// <returns></returns> TEntity Find(params object[] id); }
在 DbContext數據基類中的實現
public void SetDbContext(IUnitOfWork unitOfWork) { this.Db = (DbContext)unitOfWork; this.UnitWork = unitOfWork; }
在IOC中的使用
IUnitOfWork db; IRepository<Question_Info> question_InfoRepository; public EFController() { //反射出倉儲對象 db = ServiceLocator.Instance.GetService<IUnitOfWork>(); question_InfoRepository = ServiceLocator.Instance.GetService<IRepository<Question_Info>>(); //為倉儲對象設置上下文 question_InfoRepository.SetDbContext(db); }
在寫JOIN查詢時,它是被支持的,因為它的數據上下文是同一個
文章列表
全站熱搜