Этот пост содержит два разных, но взаимосвязанных вопроса:
Я создаю приложение с многоуровневой архитектурой. Я решил перенести несколько типов объектов между слоями, см. Архитектуру изображения 1.
Основная причина использования различных объектов - это дополнительная безопасность, безопасность по конструкции. Таким образом, объекты Dto являются объектами из базы данных, где данные фильтруются (например: hashed userId's)
Изображение 1. Архитектура
На картинке я перевожу Dto с уровня данных на бизнес, причина: разработчики бизнеса не могут неправильно использовать объекты и отправлять вредные данные базы данных.
Вопрос 1: Где я должен отобразить объекты?
Я еще не уверен, куда конвертировать объекты, сейчас я думаю сделать это в классе Repository. Я прочитал (см. Ссылку 1), что репозиторий не предназначен для этого, но у меня нет четкого объяснения этому при использовании передачи данных, как я делаю в этой архитектуре. Ссылка 1: Злоупотребление объектами сопоставления шаблонов репозитория.
Я не использую Automapper для этого, потому что не так много объектов для отображения и сохранения контроля над кодом. Я также читал, что Automapper имеет некоторые сложности, если вы хотите увидеть их, см. Ссылку 2. Ссылка 2: Ужасы Automapper.
Вопрос 2: Как я могу по-прежнему использовать общий класс и объекты карты по типу?
Например:
Общий репозиторий
public abstract class Repository<T> : IRepository<T> where T : class
{
private readonly PlatformContext _platformContext;
protected Repository(PlatformContext context) => _platformContext = context;
}
Специальный репозиторий
public class RoomRepository : Repository<Room>, IRoomRepository
{
private readonly PlatformContext _platformContext;
public RoomRepository(PlatformContext platformContext)
: base(platformContext) => _platformContext = platformContext;
}
Я могу переопределить все общие методы, но у меня есть ощущение избыточности с этой опцией. Любой, кто знаком с способом создания конфигурации отображений и возврата определенной сущности по возвращаемому значению метода.
Более простой пример вопроса:
RoomRepository наследует функцию Repository:
bool Create(T entity);
Где в этом случае T объект Room, есть ли способ выбора в соответствии с параметром в функции?
Или, может быть, у кого-то есть более простой способ, что я думаю слишком сложно.