文章出處

回到目錄

使用了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);
    }
View Code

在 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查詢時,它是被支持的,因為它的數據上下文是同一個

 

 

 回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()