C # Generics вопрос с участием контроллеров и хранилищ - PullRequest
4 голосов
/ 28 мая 2010

У меня есть базовый класс репозитория, который содержит все распространенные методы репозитория (как общие):

public abstract class BaseRepository<T, IdType> : IBaseRepository<T, IdType>

Мои репозитории с этой базы, напр .::1004*

public class UserRepository : BaseRepository<User, int>, IUserRepository

У меня также есть базовый класс контроллеров, содержащий общие действия, и он наследуется от контроллеров. Хранилище вводится в это DI. Э.Г.

public class UserController : BaseController<User>
{
        private readonly IUserRepository userRepository;

        public UserController (IUserRepository userRepository)
        {
            this.userRepository= userRepository;
        }

У меня такой вопрос: Базовый контроллер должен иметь возможность доступа к методам репозитория, которые определены в базовом репозитории. Однако я передаю через DI свой тип репозитория для каждого контроллера (хотя все они наследуются от базового репозитория). Как базовый контроллер может получить доступ к переданному хранилищу (независимо от его типа), чтобы он мог получить доступ к общим базовым методам?

Ответы [ 3 ]

1 голос
/ 28 мая 2010

Если все ваши репозитории будут получены из IBaseRepository<T,IdType>, то имеют:

interface IUserRepository : IBaseRepository<User,int> {...}

Теперь любая ссылка на IUserRepository будет знать о IBaseRepository<> членах, без необходимости упоминать конкретные типы, такие как класс UserRepository или BaseRepository<>.

1 голос
/ 28 мая 2010

Вот один из способов сделать это ..

public abstract class BaseController<TEntity, TRepository, TIdType>
    where TEntity : class, new()
    where TRepository : IBaseRepository<TEntity, TIdType>
{
    protected TRepository Repository = RepositiryFactory.GetRepository<TEntity, TRepository>();

    public IList<TEntity> GetAll()
    {
        return Repository.GetAll().ToList();
    }
    public IList<TEntity> GetAll(string sortExpression)
    {
        return Repository.GetAll(sortExpression).ToList();
    }
    public int GetCount()
    {
        return Repository.GetAll().Count();
    }
    public IList<TEntity> GetAll(int startRowIndex, int maximumRows)
    {
        var results = Repository.GetAll().Skip(startRowIndex).Take(maximumRows);
        return results.ToList();
    }
    public IList<TEntity> GetAll(string sortExpression, int startRowIndex, int maximumRows)
    {
        var results = Repository.GetAll(sortExpression).Skip(startRowIndex).Take(maximumRows);
        return results.ToList();
    }
}
1 голос
/ 28 мая 2010

Вы можете хранить ссылку для BaseReposiroty в BaseController

public class BaseController <T, IdType>
{
    ...
    ...
    protected BaseRepository<T, IdType> Reposirory
    {
        { get; set; }
    }
    ...
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...