ASP.NET Core-2.0-repository-pattern eine generische Basis Klasse
Ich bin Implementierung der Repository-Muster in einer ASP.NET Core-2.0-Anwendung.
Ich habe eine BaseRepository-Klasse wie folgt:
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();
}
}
Dann habe ich realisiert zwei konkrete repositories (ich Teste gerade):
public class CourseSubjectRepository : BaseRepository<CourseSubject>
{
public CourseSubjectRepository(ApplicationDbContext context) : base(context)
{
}
}
public class ThemeRepository : BaseRepository<Theme>
{
public ThemeRepository (ApplicationDbContext context) : base(context)
{
}
}
CourseSubject und Thema sind die POCO-Klassen repräsentieren Entitäten, die in EF-Core erste code-Datenbank.
Haben alle repositories in einem Ort, ich habe implementiert eine Art Fabrik (Kind, denn es ruft die Instanzen von DI-container):
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>();
}
}
Und jetzt am Start configureService:
services.AddScoped<ThemeRepository>();
services.AddScoped<CourseSubjectRepository>();
services.AddScoped<RepositoryFactory>();
Nun habe ich zwei Fragen:
1.- Ist das eine gute Art und Weise der Umsetzung und die Nutzung der Repository-Musters auf ASP.NET Core?
2.- Ich habe viele Personen in meiner Datenbank und ich möchte wissen, ob der einzige Weg, um Ihre Repositories zu erstellen, die eine Klasse für jeden von Ihnen, und fügen Sie es in die DI mit .AddScoped. Ich meine, jetzt, dass ich eine generische Klasse, die für alle repositories (Sie werden die gleichen Methoden), es wäre schön, fügen Sie einfach die Klasse BaseRepository DI und "irgendwie" Holen Sie sich ein konkretes repository-Instanz, die mit so etwas wie dieses:
ControllerConstructor(BaseRepository<Theme> Themes)
InformationsquelleAutor MorgoZ | 2017-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Repository-Implementierung ist toll, ich möchte nur hinzufügen, definieren eine Schnittstelle für BaseRepository und jedes der Kinder, angewiesen auf eine Abstraktion und nicht die Umsetzung.
Ist es nicht notwendig zu definieren, ein Repository für jede Tabelle der Datenbank nur einer einzelnen Person oder Haupt-Tabelle erstellt werden soll, für die abhängigen Tabellen oder Wert-Objekt kann zugegriffen werden, indem Sie in den Eigenschaften der Entität.
Ich denke, der beste Weg für DI-repositories hinzufügen, diese nacheinander auf die asp.net core-scoped
InformationsquelleAutor jcastillo
Für Ihre seconde Frage, ich implementierte ein repository namens GlobalRepository zu vermeiden, die Implementierung eines repository für jede Entität. Getestet habe ich es für 3 Monate und es funktioniert wie ein Charme. Hier ist ein link für Sie :
https://github.com/FakeSe/GlobalRepository
Hoffnung, dass es nützlich sein wird für Sie oder für jemand anderen, falls Sie auch noch Anregungen oder Kritiken bitte mir sagen ^^
GlobalRepository
im code ist generic repository, das als anti-pattern. Wenn Sie nur machen es zuabstract
werden, dient als Basis-repository und sollte gut sein dann.InformationsquelleAutor Mabrouki Fakhri