2010-08-02 5 views
3

Я пытаюсь создать общий репозиторий LINQ-TO-SQL на основе this post, который в основном позволяет вам определить общий базовый класс репозитория, а затем вы можете определить весь свой фактический репозиторий классов, исходя из общей базы.Отсутствует конструктор класса, извлеченного из общего класса

Я хочу возможность использовать репозиторий с или без прохождения в контексте данных, поэтому я решил создать два конструктора в родовом базового класса:

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: «Производные классы автоматически не наследуют базовые классы». должен быть «Производные классы не наследуют конструктор базового класса». –

1

Вы правы, конструкторы в C# не перепутаны в подклассы. Вам придется объявить их сами. В вашем примере вам необходимо нанести два конструктора для каждого из ваших репозиториев.