2010-05-28 6 views
4

J'ai une classe de référentiel de base qui contient toutes les méthodes de référentiel commun (comme générique):A C# Generics question concernant les contrôleurs et Référentiels

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

Mes référentiels de cette base, par exemple:

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

J'ai aussi une classe de contrôleur de base contenant des actions communes, et j'en hérite dans les contrôleurs. Le dépôt est injecté dans ceci par DI. Par exemple.

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

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

Ma question est la suivante: Le contrôleur de base doit être en mesure d'accéder aux méthodes du référentiel qui sont définies dans le référentiel de base. Cependant, je passe dans via DI un type de référentiel différent pour chaque contrôleur (même s'ils héritent tous du référentiel de base). Comment le contrôleur de base peut-il accéder d'une manière ou d'une autre au référentiel transmis (quel que soit son type), de sorte qu'il peut accéder aux méthodes de base communes?

+0

Le 'I' sur le cteur censé être sur le terrain? –

+0

@marc Oui, désolé - faute de frappe (ok en code réel) - Je mettrai à jour le poste. – UpTheCreek

Répondre

1

Vous pouvez tenir une référence pour BaseReposiroty dans BaseController

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

Hi Itay, c'est ce que j'essaie de faire - mais comment obtenir cette référence quand je passe dans un dépôt sous-classé? – UpTheCreek

+0

Je ne comprends pas votre question –

+0

Ah, désolé - était d'avoir un moment de gump. Je l'ai Merci. – UpTheCreek

1

Il tous vos dépôts seront dérivés de IBaseRepository<T,IdType>, alors:

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

Maintenant, toute référence à un IUserRepository sera au courant de les membres IBaseRepository<>, sans avoir à mentionner les types concrets comme la classe UserRepository ou la classe BaseRepository<>.

+0

Salut Marc, oui, je ne l'ai pas montré dans mon post, mais j'ai déjà hérité IUserRepository de IBaseRepository . – UpTheCreek

+1

@UpTheCreek - si vous voulez dire que vous avez besoin de méthodes de 'BaseRepository <>' (la classe), alors vous avez cassé le point d'abstraction à l'interface ... si vous voulez dire l'interface 'IBaseRepository <>', déjà travaillé. –

1

Voici une façon de le faire ..

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