1

J'implémente le modèle Repository dans une application ASP.NET Core 2.0.Modèle de référentiel ASP.NET Core 2.0 avec une classe de base générique

J'ai une classe BaseRepository comme suit:

public class BaseRepository<TEntity> where TEntity : class 
{ 
    private ApplicationDbContext _context; 
    private DbSet<TEntity> _entity; 

    public BaseRepository(ApplicationDbContext context) 
    { 
     _context = context; 
     _entity = _context.Set<TEntity>(); 
    } 

    public IList<TEntity> GetAll() 
    { 
     return _entity.ToList(); 
    } 

    public async Task<IList<TEntity>> GetAllAsync() 
    { 
     return await _entity.ToListAsync(); 
    } 
} 

Alors j'ai mis deux dépôts en béton (je suis juste tester):

public class CourseSubjectRepository : BaseRepository<CourseSubject> 
{ 
    public CourseSubjectRepository(ApplicationDbContext context) : base(context) 
    { 
    } 
} 

public class ThemeRepository : BaseRepository<Theme> 
{ 
    public ThemeRepository (ApplicationDbContext context) : base(context) 
    { 
    } 
} 

CourseSubject et le thème sont des classes représentant les entités POCO dans la première base de données EF Core code.

Pour avoir tous les référentiels disponibles en un seul endroit, je l'ai mis en place une sorte d'usine (enfant de parce qu'il obtient les instances du contenant DI):

public class RepositoryFactory 
{ 
    public RepositoryFactory(IServiceProvider serviceProvider) 
    { 
     _provider = serviceProvider; 
    } 

    private IServiceProvider _provider; 

    public ThemeRepository GetThemeRepo() 
    { 
     return _provider.GetService<ThemeRepository>(); 
    } 

    public CourseSubjectRepository GetCourseSubjectRepository() 
    { 
     return _provider.GetService<CourseSubjectRepository>(); 
    } 
} 

Et maintenant au démarrage configureService:

services.AddScoped<ThemeRepository>(); 
services.AddScoped<CourseSubjectRepository>(); 

services.AddScoped<RepositoryFactory>(); 

maintenant, j'ai deux questions:

Est-ce une 1.- bonne façon de mettre en œuvre et la consommation du modèle référentiel sur ASP.NET Core?

2.- J'ai plusieurs entités dans ma base de données et je veux savoir si la seule façon d'ajouter leurs dépôts est de créer une classe pour chacun d'entre eux et de l'ajouter au DI avec .AddScoped. Je veux dire, maintenant que j'ai une classe générique représentant tous les dépôts (ils auront les mêmes méthodes), il serait bien d'ajouter la classe BaseRepository à DI et "d'une façon ou d'une autre" obtenir une instance de référentiel concrète utilisant quelque chose comme ceci:

ControllerConstructor(BaseRepository<Theme> Themes) 

Répondre

0
  1. Votre mise en œuvre du référentiel est grande, je voudrais juste ajouter la définition d'une interface pour BaseRepository et chacun des enfants, dépendre d'une abstraction et non mise en œuvre.

  2. Il n'est pas nécessaire de définir un référentiel pour chaque table de la base de données, seul un pour chaque entité ou table principale doit être créé, pour accéder aux tables ou objets dépendants en parcourant les propriétés de l'entité .

Je pense que la meilleure façon pour les dépôts DI est de les ajouter un par un au cœur de asp.net SCOPED