2008-12-08 65 views
4

我正在使用一個通用的存儲庫接口,它允許我添加,查找,更新和刪除不同類型的對象。然後,我實現了兩個具體的存儲庫,並可以在不更改應用程序的情況下切換它們。一切都完美地斷開連接。但我遇到了一個障礙。我的存儲庫方法中的代碼只是感覺不對,我無法弄清楚如何更好地做到這一點。這裏是我的代碼片段:.net體系結構:創建一個IRepository <T>一般

public class OracleRepository<T> : IRepository<T> where T : new() 
{ 
    public IQueryable<T> GetAll() 
    { 
     if (typeof(T) == typeof(Object1)) 
     { 
      return (IQueryable<T>)DataAccess.GetAllObject1().AsQueryable(); 

     } 

     if (typeof(T) == typeof(Object2)) 
     { 
      return (IQueryable<T>)DataAccess.GetAllObject2().AsQueryable(); 
     } 

     throw new NotImplementedException(); 
    } 
} 

的問題是,我的數據訪問(從DataReader創建對象)是不是通用的,每種類型的對象,它支持特定的方法。

我可以重寫上面的內容,以避免if-then-elseif使用泛型或其他方式的列表嗎?

+0

不是更簡單的答案是從DataAccess返回一個對象(傳遞類型或其他)或使用NHibernate或Linq To SQL? – gcores 2008-12-08 11:53:37

回答

11

一種常見模式是使用從類型到相關類型的函數的字典。例如:

private static readonly IDictionary<Type, Func<object>> Fetchers = 
    new Dictionary<Type, Func<object>>(); 
    { 
     (typeof(Object1),() => DataAccess.GetAllObject1().AsQueryable()), 
     (typeof(Object2),() => DataAccess.GetAllObject2().AsQueryable()), 
     // etc 
    }; 

public IQueryable<T> GetAll() 
{ 
    Func<object> func = Fetchers[typeof(T)]; 
    if (func == null) 
    { 
     throw new NotImplementedException(); 
    } 
    return (IQueryable<T>) func(); 
} 

演員陣容,因爲你不能真正表達了字典中的類型的關係,但至少它是稍微容易增加新類型等

您可以移動AsQueryable()GetAll()的呼叫取決於GetAllObject1()等返回的值。