EF架構~豁出去了,為了IOC,為了擴展,改變(bian)以(yi)前的IRepository接口
使用了4年的IRepository數據倉儲接口,今天要改變了,對于這個數據倉儲操作接口,它提倡的是簡潔,單純,就是對數據上下文的操作,而直正的數據上下文本身我們卻把它忽略了,在我的IRepository接口里根本沒有數據上下文對象,這是不完整的,也許你會說,我使用了基類,數據基類里有數據上下文,是的,我也是那樣用的,但有時,這種方法有些死板了,真的,當(dang)你碰到IOC時,這(zhe)種(zhong)方式的(de)短板就出來了(le),即,每個(ge)反射出來的(de)Repository對象都(dou)(dou)是(shi)獨立的(de),每個(ge)對象里的(de)上(shang)下文(wen)也都(dou)(dou)是(shi)獨立的(de),這(zhe)是(shi)重(zhong)點,由于上(shang)下文(wen)是(shi)獨立的(de),所以(yi),很多事我們都(dou)(dou)沒法干,這(zhe)包括<JOIN關聯查詢(xun),非MSDTC的(de)事務>,看了上面的這么多原因,所以,才決定,擴展我的IRepository接口,當然,嚴格說,這違背了面向對象的原則,接口不提倡擴展,只提倡新建,呵呵.
全新的IRepository接口
/// <summary> /// 基礎的數據操(cao)作規范 /// </summary> /// <typeparam name="TEntity"></typeparam> public interface IRepository<TEntity> where TEntity : class { /// <summary> /// 設定數據上下文,它(ta)一(yi)般由構架方法(fa)注入 /// </summary> /// <param name="unitOfWork"></param> void SetDbContext(IUnitOfWork unitOfWork); /// <summary> /// 添加實體并提(ti)交到(dao)數據服務器 /// </summary> /// <param name="item">Item to add to repository</param> void Insert(TEntity item); /// <summary> /// 移除實體并(bing)提(ti)交到(dao)數據服務器 /// 如果表存在約束,需要(yao)先(xian)刪除(chu)子表信息 /// </summary> /// <param name="item">Item to delete</param> void Delete(TEntity item); /// <summary> /// 修(xiu)改實體并提交到數據服務(wu)器(qi) /// </summary> /// <param name="item"></param> void Update(TEntity item); /// <summary> /// 得(de)到指定的實體集(ji)(ji)合(延時結果集(ji)(ji)) /// Get all elements of type {T} in repository /// </summary> /// <returns>List of selected elements</returns> IQueryable<TEntity> GetModel(); /// <summary> /// 根據(ju)主鍵得(de)到實(shi)體(ti) /// </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>>(); //為倉(cang)儲對象設置上下文 question_InfoRepository.SetDbContext(db); }
在寫(xie)JOIN查詢時,它是(shi)被支持的,因(yin)為(wei)它的數(shu)據(ju)上下文(wen)是(shi)同一個