Как я могу написать следующий код в многоуровневой архитектуре и универсальном?

Я разрабатываю проект в многоуровневой архитектуре, чтобы улучшить себя. Теперь позвольте мне показать вам мои слои.

 public class EfEntityRepositoryBase<TEntity, TContext> : IEntityRepository<TEntity>
        where TEntity : class, IEntity, new()
        where TContext : DbContext, new()
    {
        public void Add(TEntity entity)
        {
            using (var context = new TContext())
            {
                var addedEntity = context.Entry(entity);
                addedEntity.State = EntityState.Added;
                context.SaveChanges();
            }
        }

        public async void AddAsync(TEntity entity)
        {
            using (var context = new TContext())
            {
                context.Add(entity);
                await context.SaveChangesAsync();
            }
        }

        public void Delete(TEntity entity)
        {
            using (var context = new TContext())
            {
                var removedEntity = context.Entry(entity);
                removedEntity.State = EntityState.Deleted;
                context.SaveChanges();
            }
        }

        public TEntity Get(Expression<Func<TEntity, bool>> filter = null)
        {
            using (var context = new TContext())
            {
                return context.Set<TEntity>().SingleOrDefault(filter);
            }
        }

        public List<TEntity> GetList(Expression<Func<TEntity, bool>> filter = null)
        {
            using (var context = new TContext())
            {
                return filter == null
                    ? context.Set<TEntity>().ToList()
                    : context.Set<TEntity>().Where(filter).ToList();
            }
        }
        public void Update(TEntity entity)
        {
            using (var context = new TContext())
            {
                var updatedEntity = context.Entry(entity);
                updatedEntity.State = EntityState.Modified;
                context.SaveChanges();
            }
        }
    }

Это мой уровень доступа к данным.

public class IProductManager : IProductService
    {
        private IProductDal _productDal;

        public IProductManager(IProductDal productDal)
        {
            _productDal = productDal;
        }

        public void Add(Product product)
        {
            _productDal.Add(product);
        }

        public void AddAsync(Product product)
        {
            _productDal.AddAsync(product);
        }

        public void Delete(int productId)
        {
            _productDal.Delete(new Product { ProductId = productId });
        }

        public List<Product> GetAll()
        {
            return _productDal.GetList();
        }
        public List<Product> GetByCategoryId(int categoryId)
        {
            return _productDal.GetList(p => p.CategoryId == categoryId || categoryId== 0);
        }
        public Product GetById(int productId)
        {
            return _productDal.Get(p => p.ProductId == productId);
        }
        public void Update(Product product)
        {
            _productDal.Update(product);
        }
    }

Это мой бизнес-уровень. Когда я пытаюсь писать обобщенно, некоторых вещей не хватает, поэтому я мало что понимаю. Теперь я хочу спросить, как мне написать следующий код, потому что я новичок, я не мог этого сделать.

List<Product> products = context.Products.Include(x => x.Photos).ToList();

Я могу разместить его где угодно.

«Теперь я хочу спросить, как мне написать следующий код, потому что я новичок, я не мог этого сделать». Что значит "не смог"?

Kirk Woll 07.04.2022 00:06

Хм, что вы имеете в виду, говоря, что чего-то не хватает? И ты многого не понимаешь

Maytham 07.04.2022 00:11

Как написать "List<Product> products = context.Products.Include(x => x.Photos).ToList();"" общий?

Enescan 07.04.2022 00:17

Вы имеете в виду, что хотите получить список продуктов?

Qing Guo 07.04.2022 07:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я вас правильно понял, вы хотите изменить

List<Product> products = context.Products.Include(x => x.Photos).ToList()

на что-то вроде:

List<T> entities = context.Set<T>().Include(x => x.Photos).ToList()

Вы не можете. Допустим, вы хотите использовать этот общий класс для своей модели Category, а ваша модель Category не имеет свойства Photos.

Я бы предложил создать общий Repository класс для всех CRUD операций.

public interface IBaseRepository<T> where T : class
{
    Task AddAsync(T entity);
    void Delete(T entity);
    void Update(T entity);
    Task<IEnumerable<T>> GetAllAsync();
    Task<T> FindAsync(Expression<Func<T, bool>> expression);
}

И реализация:

public class BaseRepository<T> : IBaseRepository<T> where T : class
{
    protected readonly AppDbContext _context;

    private DbSet<T> _dbSet;

    public DbSet<T> DbSet => _dbSet ??= _context.Set<T>();

    public BaseRepository(AppDbContext context)
    {
        _context = context;
    }

    public async Task AddAsync(T entity)
    {
        await DbSet.AddAsync(entity);
    }

    public void Delete(T entity)
    {
        DbSet.Remove(entity);
    }

    public void Update(T entity)
    {
        DbSet.Update(entity);
    }

    // here we made vitrual, this gaves us opportunity to override this method 
    public virtual async Task<IEnumerable<T>> GetAllAsync()
    {
        return await DbSet.ToListAsync();
    }

    public virtual async Task<T> FindAsync(Expression<Func<T, bool>> expression)
    {
        return await DbSet.Where(expression).FirstOrDefaultAsync();
    }
}

Ваш Product репозиторий:

public class ProductRepository : BaseRepository<Product>
{
    public ProductRepository(AppDbContext context) : base(context)
    {
    }

    public async override Task<IEnumerable<Product>> GetAllAsync()
    {
        return await DbSet.Include(p => p.Photos).ToListAsync();
    }
}

Другие вопросы по теме