2010-08-02 127 views
3

我想创建一个基于this post的通用LINQ-TO-SQL存储库,它基本上可以让你定义一个通用的基础知识库类,然后你可以定义所有的实际知识库类来自通用基础。从泛型类泛型类中缺少构造函数

我想使用一个仓库有或没有通过数据上下文的选项,所以我决定在通用基类来创建两个构造函数:

public abstract class GenericRepository<T, C> 
     where T : class 
     where C : System.Data.Linq.DataContext, new() 
    { 
     public C _db; 

     public GenericRepository() 
     { 
      _db = new C(); 
     } 


     public GenericRepository(C db) 
     { 
      _db = db; 
     } 


     public IQueryable<T> FindAll() 

    ... and other repository functions 
    } 

要使用它,我会derrive我的实际仓储类:

public class TeamRepository : GenericRepository<Team, AppDataContext> { } 

现在,如果我尝试用参数使用:

AppDataContext db = new AppDataContext(); 
TeamRepository repos=new TeamRepository(db); 

我得到的错误: “App.Models.TeamRepository”不包含一个构造函数1个参数

因此,它看起来就像你不能继承C#构造函数,那么,你将如何让我这个代码可以调用:TeamRepository()或TeamRepository(db)

回答

6

派生类不会自动继承任何基类的构造函数,您需要明确定义它们。然而

public class TeamRepository : GenericRepository<Team, AppDataContext> 
{ 
    public TeamRepository() : base() { } 
    public TeamRepository(AppDataContext db) : base(db) { } 
} 

请注意,如果基类定义(或明或暗地)可访问的默认构造函数,派生类的构造函数会隐含调用它,除非构造函数中显式调用。

+0

M:“派生类不会自动继承基类”。应该是“派生类不会自动继承基类的构造函数”。 – 2010-08-02 20:40:51

1

你是对的,C#中的构造函数不会冒泡成子类。你必须自己申报。在您的示例中,您需要为每个存储库提供两个构造函数。

相关问题