Я работаю в проекте с 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 с его свойствами, улучшенными с другими объектами.
Что мне делать? Где я делаю не так?