涉及控制器和存储库的c#泛型问题

时间:2010-05-28 08:02:36

标签: c# asp.net-mvc generics repository

我有一个基础存储库类,它包含所有常见的存储库方法(通用):

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

我的存储库来自这个基地,例如:

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

我还有一个包含常见操作的基本控制器类,并在控制器中继承此操作。存储库由DI注入其中。 E.g。

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

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

我的问题是:基本控制器需要能够访问基本存储库中定义的存储库方法。但是,我通过DI为每个控制器传递了一个不同的存储库类型(即使它们都从基础存储库继承)。基本控制器如何以某种方式访问​​传入的存储库(无论它是什么类型),以便它可以访问公共基本方法?

3 个答案:

答案 0 :(得分:1)

您可以在BaseReposiroty

中保留BaseController的引用
public class BaseController <T, IdType>
{
    ...
    ...
    protected BaseRepository<T, IdType> Reposirory
    {
        { get; set; }
    }
    ...
    ...
}

答案 1 :(得分:1)

您的所有存储库都将从IBaseRepository<T,IdType>派生,然后具有:

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

现在,对IUserRepository的任何引用都会了解IBaseRepository<>成员,而不必提及UserRepository类或BaseRepository<>类等具体类型。

答案 2 :(得分:1)

这是一种方法..

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();
    }
}