2014-11-05 32 views
0

我正在閱讀關於存儲庫模式的設計。 This article非常好,但我不明白構造函數中的一些東西。從通用接口繼承的泛型類中混淆字段賦值

在此代碼:

public interface IRepository<T> where T : class 
    { 
     IQueryable<T> GetAll(); 
     T GetById(int id); 
     void Add(T entity); 
     void Update(T entity); 
     void Delete(T entity); 
     void Delete(int id); 
    } 

    /// <summary> 
    /// The EF-dependent, generic repository for data access 
    /// </summary> 
    /// <typeparam name="T">Type of entity for this Repository.</typeparam> 
    public class MyRepository<T> : IRepository<T> where T : class 
    { 
     public MyRepository(DbContext dbContext) 
     { 
      if (dbContext == null) 
       throw new ArgumentNullException("Null DbContext"); 
      DbContext = dbContext; 
      DbSet = DbContext.Set<T>(); 
     } 

     protected DbContext DbContext { get; set; } 

     protected DbSet<T> DbSet { get; set; } 

     public virtual IQueryable<T> GetAll() 
     { 
      return DbSet; 
     } 

     public virtual T GetById(int id) 
     {   
      return DbSet.Find(id); 
     } 

     public virtual void Add(T entity) 
     { 
      DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
      if (dbEntityEntry.State != EntityState.Detached) 
      { 
       dbEntityEntry.State = EntityState.Added; 
      } 
      else 
      { 
       DbSet.Add(entity); 
      } 
     } 

     public virtual void Update(T entity) 
     { 
      DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
      if (dbEntityEntry.State == EntityState.Detached) 
      { 
       DbSet.Attach(entity); 
      } 
      dbEntityEntry.State = EntityState.Modified; 
     } 

     public virtual void Delete(T entity) 
     { 
      DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
      if (dbEntityEntry.State != EntityState.Deleted) 
      { 
       dbEntityEntry.State = EntityState.Deleted; 
      } 
      else 
      { 
       DbSet.Attach(entity); 
       DbSet.Remove(entity); 
      } 
     } 

     public virtual void Delete(int id) 
     { 
      var entity = GetById(id); 
      if (entity == null) return; // not found; assume already deleted. 
      Delete(entity); 
     } 
    } 

在其構造函數中,我讀到:

DbContext = dbContext; 
DbSet = DbContext.Set<T>(); 

也許這意味着什麼,但它沒有任何意義,我因爲DbContext是一類不一個存儲對象的引用的變量。我總是繼承DbContext並創建我自己的DbContext,然後創建它的一個實例/元素。這裏有什麼特別的含義嗎?我很奇怪,爲什麼作者沒有寫這樣這些行:

MyDbContext dbContext = new MyDbContext(); 

感謝

+0

你已經張貼不會編譯版本庫的代碼,它更有意義,如果類實際上有一個在構造函數中被賦予的屬性如鏈接文章中所述。 – 2014-11-05 10:19:58

+0

我已經添加了接口和整個類的定義,但還有更多的代碼,我不確定還需要什麼。隨意做進一步的修改。 – Celdor 2014-11-05 10:35:54

回答

3

進一步往下看,這個類的源代碼,你會看到:

protected DbContext DbContext { get; set; } 

這是聲明DbContext類型的屬性,它也被稱爲DbContext。在ctor中分配時,您正在分配給此屬性。

(該範圍的規則在C#中的工作方式是指在構造本身的DbContext解析爲名字的類的屬性,而不是類型DbContext

是的,這可能會造成混淆。出於這個原因,作者可能會更好地賦予該屬性與其類型不同的名稱 - 但這種命名實際上相當普遍。

最起碼,在構造函數應該這樣改寫:

public MyRepository(DbContext dbContext) 
{ 
    if (dbContext == null) 
     throw new ArgumentNullException("Null DbContext"); 
    this.DbContext = dbContext; 
    this.DbSet = this.DbContext.Set<T>(); 
} 
+0

它清除所有內容。感謝您的回答 :) – Celdor 2014-11-05 10:29:05