繁体   English   中英

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

[英]A c# Generics question involving Controllers and Repositories

我有一个基本存储库类,其中包含所有常见的存储库方法(作为通用):

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

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

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为每个控制器传递了一个不同的存储库类型(即使它们都从基础存储库继承)。 基本控制器如何以某种方式访问​​传入的存储库(无论它是什么类型),以便它可以访问公共基本方法?

您可以在BaseReposirotyBaseController的引用

public class BaseController <T, IdType>
{
    ...
    ...
    protected BaseRepository<T, IdType> Reposirory
    {
        { get; set; }
    }
    ...
    ...
}

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

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

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

这是一种方法..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM