2013-02-28 88 views
1

我有一個通用的存儲庫類。獲取類型特定版本的泛型類型

public class Repository<TEntity> where TEntity : class 
{ 
    public virtual TEntity Create() 
    { 
     // Create implementation. 
    } 
    public virtual bool Add(TEntity entity) 
    { 
     // Add implementation. 
    } 
    public virtual bool Delete(TEntity entity) 
    { 
     // Delete implementation. 
    } 
    public virtual int SaveChanges() 
    { 
     // Save changes implementation. 
    } 
} 

我有幾種類型的不完全,所以我希望做一個具體實施beheaviour匹配,主要爲Create方法。

喜歡的東西:

public class SpecificEntityRepository : Repository<SpecificEntity> 
{ 
    public override SpecificEntity Create() 
    { 
     // Other create implementation. 
    } 
} 

有沒有一種方法,如果一個人使用Repository<SpecificEntity>返回的SpecificEntityRepository方法的值,例如在Repository<>構造函數返回SpecificEntityRepository當參數類型等於SpecificEntity

我正在尋找一種通用的方法來做到這一點。在我的項目的最終版本中,可能會有多達200個特定的存儲庫,其中95%的功能是通用的。

回答

1

如果您想阻止人們創建Repository<SpecificEntity>,您可以製作Repository構造函數protected並且只允許通過工廠方法創建實例。

例如:

public class Repository<TEntity> where TEntity : class 
{ 
    private static readonly Dictionary<Type, Func<object>> specificRepositories = 
     new Dictionary<Type, Func<object>> 
     { 
      { typeof(SpecificEntity),() => new SpecificRepository() } 
     }; 

    protected Repository() {} 

    public static Repository<T> Create<T>() where T : class 
    { 
     var entityType = typeof(T); 
     if (specificRepositories.ContainsKey(entityType)) { 
      return (Repository<T>)specificRepositories[entityType](); 
     } 
     else { 
      return new Repository<T>(); 
     } 
    } 

    // default implementations omitted 
} 

我基於存儲庫實例的分辨率基於對Dictionary實體類型,因爲這是維護更方便,但如果我們是在談論只是一對夫婦的具體資料庫您可以改爲使用if/else if

+0

謝謝你添加字典的想法。對於庫的數量,我將需要它更實際。 – 2013-02-28 11:32:30

1

一旦調用了特定的構造函數,就無法更改該對象的類。
但是你可以使用一個工廠方法,而不是直接調用實際構造:

public static Repository<T> CreateRepository<T>() { 
    if (typeof(T) == typeof(SpecificEntity)) { 
     return new SpecificEntityRepository(); 
    } 
    return new Repository<T>(); 
} 

,以確保它是用來,你應該保護的實際構造。