sfreaky
@sfreaky
Начинающий веб и софт разработчик

Как правильно написать интерфейс для БД?

На данный момент есть такой интерфейс репозитория
public interface IRepository
    {
        
        DbSet<Sub> Subs { get; set; }
        IEnumerable<Comment> Comments { get; }
        IEnumerable<Review> Reviews { get; }
        IEnumerable<Application> Applications { get; }
        IEnumerable<Tender> Tenders { get; }
        IEnumerable<Offer> Offers { get; }
        IEnumerable<SubGroup> SubGroups { get; }
    }

И конкретная реализация с помощью EntityFramework
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IRepository
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
        protected override void OnModelCreating(ModelBuilder builder)
        {
                base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
        public DbSet<Post> Posts { get; set; }
        public DbSet<Attachment> Attachments { get; set; }
        public DbSet<User_Meta> User_Meta { get; set; }
        public DbSet<Post_Meta> Post_Meta { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<SubGroup> SubGroups { get; set; }
        public DbSet<Sub> Subs { get; set; }
        public IEnumerable<Comment> Comments { get { return Posts.OfType<Comment>().AsEnumerable(); } }
        public IEnumerable<Review> Reviews { get { return Posts.OfType<Review>().AsEnumerable(); } }
        public IEnumerable<Application> Applications { get { return Posts.OfType<Application>().AsEnumerable(); } }
        public IEnumerable<Tender> Tenders { get { return Posts.OfType<Tender>().AsEnumerable(); } }
        public IEnumerable<Offer> Offers { get { return Posts.OfType<Offer>().AsEnumerable(); } }
       
    }

Для каждой таблицы должны быть методы Create,Update,Delete, что IEnumerable не предоставляет. Как будет правильно: использовать приведение типов в коде, когда требуется произвести изменения в определенной таблицы, или учесть это в интерфейсе?
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 1
Правильно будет не мешать DbContext с Repository.

Создать интерфейс IRepository<T>, определить там сигнатуры методов Add, Update, Delete etc. Реализовать этот интерфейс в абстрактном базовом классе RepositoryBase<T>, добавив туда типизированное свойство DbSet<T>. Затем для каждой сущности создать конкретный класс(CommentsRepo, PostsRepo ... etc.), наследуясь от абстрактного RepositoryBase<T>. При необходимости, можно ещё и интерфейс для этой же сущности реализовать(если там отличная от CRUD логика).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы