Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
涉及控制器和存储库的c#泛型问题_C#_Asp.net Mvc_Generics_Repository - Fatal编程技术网

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

涉及控制器和存储库的c#泛型问题,c#,asp.net-mvc,generics,repository,C#,Asp.net Mvc,Generics,Repository,我有一个基本存储库类,它包含所有常见的存储库方法(作为泛型): public抽象类BaseRepository:IBaseRepository 我在此基础上的存储库,例如: public class UserRepository : BaseRepository<User, int>, IUserRepository public类UserRepository:BaseRepository、IUserRepository 我还有一个包含常见操作的基本控制器类,并在控制器中继承它

我有一个基本存储库类,它包含所有常见的存储库方法(作为泛型):

public抽象类BaseRepository:IBaseRepository
我在此基础上的存储库,例如:

public class UserRepository : BaseRepository<User, int>, IUserRepository
public类UserRepository:BaseRepository、IUserRepository
我还有一个包含常见操作的基本控制器类,并在控制器中继承它。存储库是由DI注入的。例如

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

        public UserController (IUserRepository userRepository)
        {
            this.userRepository= userRepository;
        }
公共类UserController:BaseController
{
专用只读IUserRepository userRepository;
公共用户控制器(IUserRepository userRepository)
{
this.userRepository=userRepository;
}

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

您可以在
BaseController
中保留
BaseReposiroty
的引用

public class BaseController <T, IdType>
{
    ...
    ...
    protected BaseRepository<T, IdType> Reposirory
    {
        { get; set; }
    }
    ...
    ...
}
公共类BaseController
{
...
...
受保护的BaseRepository repository
{
{get;set;}
}
...
...
}

您的所有存储库都将从
IBaseRepository
中派生,然后具有:

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

现在,对
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();
    }
}
公共抽象类BaseController
其中tenty:class,new()
存放地点:IBaseRepository
{
受保护的TRepository Repository=repositoryFactory.GetRepository();
公共IList GetAll()
{
返回Repository.GetAll().ToList();
}
公共IList GetAll(字符串排序表达式)
{
返回Repository.GetAll(sortExpression.ToList();
}
public int GetCount()
{
返回Repository.GetAll().Count();
}
公共IList GetAll(int startRowIndex,int maximumRows)
{
var results=Repository.GetAll().Skip(startRowIndex).Take(maximumRows);
返回结果。ToList();
}
公共IList GetAll(字符串sortExpression、int startRowIndex、int maximumRows)
{
var results=Repository.GetAll(sortExpression).Skip(startRowIndex).Take(maximumrrows);
返回结果。ToList();
}
}

ctor上的
I
是否应该在字段中?@marc Yes,抱歉-输入错误(在真实代码中为ok)-我会更新帖子。嗨,Itay,这正是我想做的-但是当我传递一个子类存储库时,我如何获得这个引用?我不理解你的问题嗨,马克,是的,我没有在帖子中显示它,但我已经从iBaserRepository继承了IUserRepository。@UpTheCreek-如果你的意思是你需要
BaseRepos的方法itory
(类),那么您已经突破了对接口进行抽象的要点……如果您指的是
IBaseRepository
接口,那么它应该已经可以工作了。
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();
    }
}