Отображение результатов репозиториев в AGGREGATION ENTITY в слое DOMAIN - PullRequest
0 голосов
/ 16 января 2020

Я работаю в проекте с NET core 3 и C# в качестве языка. Я пытаюсь использовать подход чистой архитектуры, CQRS и шаблоны репозитория. Я выбрал DAPPER в качестве ORM.

У меня есть 3 слоя:

  • DOMAIN: с моими сущностями, объектами агрегации, объектом значения;
  • ПРИМЕНЕНИЕ: здесь я реализация логики c с QUERIES и COMMAND (CQRS) и интерфейсом (например, репозиториями), который я реализую на уровне PERSISTENCE;
  • PERSISTENCE: с DAPPER этот уровень совместно использует те же объекты DOMAIN.

У меня есть сомнения по поводу того, как создать объект агрегации. Например:

Класс Person является агрегацией, а Person может иметь от 1 до N Photo

public class Person
    {
        public Person()
        {
            Photos = new HashSet<PersonHasPhotos>();
        }

        public int Id { get; set;}
        public string Name { get; set;}

        public ICollection<PersonHasPhotos> Photos  { get;  set; }

    }

Класс Photo является нормальной сущностью

public class Photo
    {
        public Photo()
        {
        }

        public int Id { get; set;}
        public string Description { get; set;}
        public byte[] Photo { get; set;}


    }

Класс PersonHasPhotos, который указывает, где (позиция на экране) Человек хочет видеть фотографию на своей ГЛАВНОЙ СТРАНИЦЕ

public class PersonHasPhotos
    {
        public PersonHasPhotos()
        {
        }

        public int PersonId { get; set;}
        public int PhotoId { get; set;}
        public string PositionOnTheScreen { get; set;}

        public Photo Photo { get; set;}
        public Person Person { get; set;}


    }

В своем слое ПРИЛОЖЕНИЯ я определил один Хранилище для каждой сущности. Каждый репозиторий имеет простой спецификатор задания c для сущности (только простой CRUD, без JOIN). Я выбрал это, потому что я буду использовать репозитории на уровне APPLICATION и там я могу поместить logi c, а также управлять транзакциями.

У меня есть IPersonRepository, IPhotoRepository и IPersonHasPhotoRepository.

public interface IPersonHasPhotosRepository
    {
        IEnumerable<PersonHasPhotos> GetForPerson(int PersonId);

    }

public interface IPhotosRepository
    {
        IEnumerable<Photos> Get(int PersonId);

    }

public interface IPersonRepository
    {
        Person Get(int PersonId);

    }

В моем слое APPLICATION у меня есть QUERY с именем GetPerson(int id). В HANDLER этого запроса я называю эти репозитории.

В моем слое PERSISTENCE с DAPPER я могу отобразить результаты запроса непосредственно в мою сущность. Доменные сущности являются общими для всех слоев, и я не хочу помещать logi c в слой PERSISTENCE, чтобы объяснить, как создавать агрегирующие сущности.

Проблема в том, что эти репозитории дают мне 3 разных объекта ( Person, List<PersonHasPhoto>, List<Photo>) но я хотел бы объединить их только в одном объекте PERSON с его свойствами, улучшенными с другими объектами.

Что мне делать? Где я делаю не так?

1 Ответ

0 голосов
/ 01 февраля 2020

Я вижу два варианта

  • , согласующихся с тем фактом, что эти три хранилища возвращают разные сущности (экземпляры) и «ссылку» и сравнивают их на основе их идентификаторов

  • go для шаблона «Единица работы» и один репозиторий всегда возвращает все три объекта вместе

...