У меня есть решение, которое я реализовал с помощью архитектуры Onion и DDD, например eShopOnContainers .
Но у меня есть проблема для этого, поэтому я решил поделиться ею с вами.Я пытаюсь объяснить это на примере.Вы предполагаете, что у меня есть interface
с именем IOrderRepository
как IOrderRepository
public interface IOrderRepository : IRepository<Order>
{
Order Add(Order order); // first issue
Task<OrderDTO> GetAsync(int orderId); // second issue
}
Первая проблема
Я реализовал Add
методкак OrderRepository , но мне нужны дополнительные параметры в методе Add
, например, следующий код:
public Order Add(Order order, int par1, int par2)
{
// I need a DTO to persist order
OrderDTO orderDTO = new OrderDTO({Order = order, Par1 = par1, Par2 = par2 });
// Call a method with orderDTO parameter as a service to insert order
}
Как видите, реализация IOrderRepository
неправильна из-за дополнительных параметров, которые мне нужны.
Неправильные решения для первого выпуска
У меня есть два неправильных решения для решения этой проблемы.
1- Регулировка IOrderRepository
Изменение входных IOrderRepository
параметров путем добавления параметров, таких как:
public interface IOrderRepository : IRepository<Order>
{
Order Add(Order order, int par1, int par2);
}
Как я знаю, для par1 and par2
нет бизнес-правила и реализации DDDПрежде всего, я должен указать IRepository
, но, используя это решение, я помещаю проблемы уровня инфраструктуры в слой домена, который является неправильной архитектурой.
2 - перевод IOrderRepository
на уровень инфраструктуры
Я могу поставить IOrderRepository
в слое инфраструктуры, но это еще одна неправильная дугаархитектура, потому что, насколько я знаю, интерфейсы такого рода должны быть расположены в Domain layer
.
Мой первый вопрос
1 - Как я могу использовать дополнительныепараметры в методах Репозитория на уровне инфраструктуры для реализации IRepository уровня домена, что нет никакой связи между параметрами и уровнем домена?
Второй выпуск
Как вы можете видеть в IOrderRepository
, я должен реализовать метод GetAsync
, который возвращает OrderDTO
, включая Order
и дополнительные параметры.Как я знаю, я не могу использовать DTO (Data Transfer Object) в доменном слое.Я не мог придумать идею справиться с этим.
Мой второй вопрос
2 - Как я могу вернуть методы DTO OrderRepository
, которыена уровне инфраструктуры, но я не могу применить его в IOrderRepository
, который находится на уровне домена.
Заранее спасибо за ваше время.