2014-11-06 206 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); 
}