Хранилище объектов в нескольких сервисах - PullRequest
0 голосов
/ 19 апреля 2019

Я делаю свой проект свободного времени в .Net core 2.2

Я разделил свой проект на 4 части

1) DataLayer 2) RepositoryLayer 3) Услуги 4) Уровень веб-API

У меня есть одна модель, и давайте сделаем, например, ее IPerson . Тогда у меня есть общий репозиторий здесь

class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity, IPhysicalPersonEntity
    {
        private readonly DataContext _context;
        private DbSet<TEntity> _entities;
        string errorMessage = string.Empty;

        public Repository(DataContext context)
        {
            _context = context;
            _entities = context.Set<TEntity>();
        }
        public void Delete(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Remove(entity);
            _context.SaveChanges();
        }

        public IEnumerable<TEntity> GetAll()
        {
            return _entities
                .AsEnumerable();
        }

        public TEntity GetByIdentifyNumber(int identifyNumber)
        {
            return _entities
                .SingleOrDefault(e => e.Id == identifyNumber);
        }

        public void Insert(TEntity entity)
        {
            if(entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Add(entity);
            _context.SaveChanges();
        }

        public void Remove(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Remove(entity);
        }

        public void SaveChanges()
        {
            _context.SaveChanges();
        }

        public void Update(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            var currentEntity = _entities
                .SingleOrDefault(e => e.Id == entity.Id);

            currentEntity = entity;

            _context.SaveChanges();
        }
    }

Как вы упомянули, третий уровень предназначен для Служб , поэтому у меня есть здесь службы для

  1. Добавить человека
  2. Удалить человека.
  3. Редактировать персонажа.
  4. Найдите человека с идентификатором.
  5. Добавить персональные рекомендации.
  6. 1027 * Etc. *

Каждый сервис - это отдельный класс с единым интерфейсом. Я знаю, что в каждом сервисе я должен использовать свой объект и методы хранилища.

Но мои вопросы:

  • Как обрабатывать один объект репозитория в каждом сервисе?
  • Я не хочу создавать каждый объект репозитория в каждом сервисе. (Или, может быть, это правильно?)
  • Какая лучшая практика в этой ситуации?
  • Я неправильно делаю свою архитектуру?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Архитектура и лучшие практики, от которых зависит ваш проект, иногда вам не нужен Datalayer и сервис отдельно, но иногда вы можете отделить его, но вы можете использовать эту ссылку для Реализация шаблона репозитория: Generic-Repository-Pattern-в-ASP-NET

0 голосов
/ 19 апреля 2019

Я использую ту же структуру, которая DataLayer, Repository, WebAPI.

И я построил структуру следующим образом

  • Мой слой хранилища такой же, как ваш
  • В моем слое WebAPI я использую BaseController, а другие контроллеры являются производными от BaseController

    public class ApiBaseController<T> : ApiController where T : class {
    
    [HttpPut]
    [Authorize]
    [ActionName("Update")]
    [Produces("application/json")]
    public T Put([FromBody]T entity) // Update
    {
        using (MyContext db = new MyContext()) 
        {
           repository.Update(updateElement);
           return entity;
        }
    }
    
    
    [HttpPost]
    [Authorize]
    [ActionName("Add")]
    [Produces("application/json")]
    public T Post([FromBody]T entity)//Add new record
    {
        try
        {
            lock (LockObjectAdd)
            {
                using (MyContext db = new MyContext())
                {
                    Repository<T> repository = new Repository<T>(db);
                    repository.Add(entity);
                    return entity;
                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    
    }
    

и контроллеры созданы таким образом;

public class ApiUserController : ApiBaseController<DataLayer.Models.User> { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...