Класс, полученный из универсального репозитория

У меня есть класс Generic Repository, см. ниже, который используется для выполнения общих функций доступа к данным, т. е. Add, GetByID и т. д.

    public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
    internal GolfEntities context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(GolfEntities context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }

    public TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

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

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

Repository.GenericRepository‹ User> не содержит конструктор, который принимает 0 аргументов

public class UserRepository : GenericRepository<User>, IUserRepository
{

    internal GolfEntities _context;

    public UserRepository() : base() { }

    public UserRepository(GolfEntities context)
    {
        _context = context;
    }

    public string FullName()
    {
        return "Full Name: Test FullName";
    }


}

Кто-нибудь знает, как это исправить?

Любая помощь приветствуется.

Спасибо.


person tcode    schedule 07.03.2012    source источник


Ответы (3)


Вы должны удалить конструктор по умолчанию из производного репозитория:

public UserRepository() : base() { }

Поскольку в вашем базовом классе репозитория нет конструктора без параметров, вызов base() не имеет смысла. Также вам не нужно повторять ту же логику в производном конструкторе, что и в базовом. Вы можете только вызвать его:

public class UserRepository : GenericRepository<User>, IUserRepository
{
    public UserRepository(GolfEntities context): base(context)
    { 

    }

    public string FullName()
    {
        return "Full Name: Test FullName";
    }
}
person Darin Dimitrov    schedule 07.03.2012
comment
Дарин, если я это сделаю, я все равно получу ту же ошибку... Repository.GenericRepository‹ User› не содержит конструктор, который принимает 0 аргументов - person tcode; 07.03.2012
comment
@tgriffiths, обратите внимание, я вызываю базовый конструктор в производном конструкторе: public UserRepository(GolfEntities context): base(context). - person Darin Dimitrov; 07.03.2012

Измените свой UserRepository на это:

public class UserRepository : GenericRepository<User>, IUserRepository
{
    public UserRepository(GolfEntities context)
        : base (context)
    {
    }

    public string FullName()
    {
        return "Full Name: Test FullName";
    }
}

В вашем GenericRepository нет конструктора по умолчанию, поэтому вам нужно вызвать конструктор, ожидающий вашего контекста GolfEntities, и передать параметр вниз.

person Trevor Pilley    schedule 07.03.2012
comment
Спасибо, Тревор, это очень полезно. - person tcode; 07.03.2012

Базовый (общий) репозиторий не имеет конструктора по умолчанию без параметров, поэтому вы не можете написать это:

  public UserRepository() : base() { }

Вам нужно вызвать один из конструкторов базового класса.

person cynic    schedule 07.03.2012