2010-05-28 33 views
4

我有一个包含所有的公共储存库的方法基地仓储类(如通用):一个C#泛型问题涉及控制器和存储库

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

+0

是意味着是该领域的构造函数的'I'? – 2010-05-28 08:11:21

+0

@marc是的,抱歉 - 错字(确定在真实的代码中) - 我会更新帖子。 – UpTheCreek 2010-05-28 08:13:16

回答

1

可以持有BaseController

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

嗨Itay,这就是我正在做的 - 但是当我传入一个子类库时如何获得这个引用? – UpTheCreek 2010-05-28 08:12:04

+0

我不明白你的问题 – 2010-05-28 08:16:51

+0

啊,对不起 - 当时正在g moment。知道了谢谢。 – UpTheCreek 2010-05-28 08:27:33

1

它所有的存储库BaseReposiroty参考将从IBaseRepository<T,IdType>导出,然后有:

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

我们一个IUserRepository任何引用会知道IBaseRepository<>成员,而不必提及具体类型,如UserRepository类或BaseRepository<>类。

+0

嗨马克,是的,我没有在我的帖子中显示它,但我已经从IBaseRepository 继承了IUserRepository。 – UpTheCreek 2010-05-28 08:16:42

+1

@UpTheCreek - 如果你的意思是你需要'BaseRepository <>'(类)的方法,那么你已经打破了抽象接口的点......如果你的意思是'IBaseRepository <>'接口,它应该已经工作。 – 2010-05-28 08:43:44

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