2014-11-06 207 views
0

我試圖創建一個簡單的數據訪問類,它充當庫來返回各種實體。我所有的實體類都是通過VS 2013中的Linq-to-SQL映射器生成的,所有實體類都可以通過Find(primary id)從dataContext返回非泛型類中的泛型方法

我想定義一般的Find,Delete,更新等,而不必爲每個表/對象重複它,但我不想創建一個存儲庫模式。

如何創建一個通用的方法,無論工作嗎?這就是我所擁有的,當然它說T沒有定義,但我認爲我們可以在非泛型類中創建泛型方法,所以我做錯了什麼?

我想什麼做的是一樣的東西

var c = DAL<Customer>.Find(id) 

var e = DAL<Employee>.Find(id) 

...等

我試圖寫的代碼是

public class DAL 
    { 
     private string _key; 
     private DataContext _context = null; 
     //private DbSet<T> _table = null; 


     public DAL(string key) 
     { 
      _key = key; 
      _context = new DataContext(); 
     } 

     public void Dispose() 
     { 
      _context.Dispose(); 
     } 


     public DbSet<T> Find<T>(int id) 
     { 
      var d = _context.Set<T>(); 
      //return d.Find(id); 
     } 
    } 

我有點失落...我不想定義

public class DAL<T> where T:class 

它關係到每個DAL一種類型

這是我第一次涉足通用nethods所以任何幫助讚賞

+0

這與MVC或LINQ無關,編輯標籤... – 2014-11-06 04:50:02

+0

爲什麼?爲什麼?? var c = DAL 。find(id)=在linq中有一個簡單的Db.Customers.Single(c => c.id ==?); DAL的好處是什麼? – Pleun 2014-11-06 20:38:48

+0

@Pleun我聽到你的痛苦,我會做更多的不僅僅是訪問(例如,採用一些緩存等,一些集中代碼),如果沒有多大意義,我沒有任何疑慮,它會將其殺死 – Gerry 2014-11-07 15:40:54

回答

1

您可以指定一個通用的方法一類的,但你需要使用一個約束:

public class DAL 
{ 
    // .... previously written code 
    public DbSet<T> Find<T>(int id) where T : class 
    { 
     return _context.Set<T>(); 
    } 
} 

你也必須這樣稱呼它:

var dal = new DAL(); 
var data = dal.Find<Customer>(1); 

另外請注意,您的代碼有很多問題,你定義一個Dispose方法,但你不實現IDisposable接口,你沒有真正從方法返回任何東西,等等。

注意:對於所有意圖和目的,這仍然是存儲庫模式。

+0

謝謝你的解釋。我剩下的代碼還沒有完成,我只是試圖在深入我的代碼之前弄清這個特定的概念。 – Gerry 2014-11-06 13:37:45

1

像這樣的東西應該工作:

public T Find<T>(int id) where T : class 
{ 
    return context.Set<T>().Find(id); 
}