web api - вернуть сложный объект домена из уровня хранилища - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над проектом, который в настоящее время находится на начальной стадии, поэтому я могу внести некоторые архитектурные изменения на этом этапе. Это больше связано с дизайном. Итак, вот оно:

Я создаю Web API + EF + .net Framework + Шаблон репозитория.

Итак, у меня есть слой репозитория, который возвращает данные из контекста базы данных. Ниже приведен фрагмент кода linq в слое репозитория:

from custVerExt in _context.VERIFICATIONEXTs.Where(x => x.ID == custVer.ID).DefaultIfEmpty()
from zref_vcode in _context.LISTDATAs.Where(x => x.ID == custVerExt.VERIFICATIONCD).DefaultIfEmpty()
from refUi_vcode in _context.LBLTXTs.Where(x => x.ID == zref_vcode.REFLISTDATANMLBLID).DefaultIfEmpty()
from zref_tcode in _context.LISTDATAs.Where(x => x.ID == custVerExt.TYPEID).DefaultIfEmpty()
from refUi_tcode in _context.LBLTXTs.Where(x => x.ID == zref_tcode.REFLISTDATANMLBLID).DefaultIfEmpty()

Теперь я хочу, чтобы оба объекта refUi_vcode & refUi_tcode типа _context.LBLTXTs были возвращены.

что-то вроде select refUi_vcode.name,refUi_tcode.name

Я не хочу, чтобы мой репозиторий возвращал DTO (это работа моего уровня обслуживания), поэтому я хочу вернуть некоторый объект домена клиента. Теперь я придумал две структуры для моего доменного объекта. В случае, указанном выше, если я хочу вернуть значение из одной и той же таблицы дважды, я могу создать два экземпляра одного и того же объекта ИЛИ создать два отдельных свойства, которые я хочу из этих двух объектов.

Пример кода:

public class CustDomainObj
{
public LBLTXTs obj1 {get;set;}
public LBLTXTs obj2 {get;set;}
}
//OR
public class CustDomainObj
{
public string obj1 {get;set;}
public string obj2 {get;set;}
}

Мой DTO выглядит так:

public CustDTO
{
public string vname{get;set;}
public string cname{get;set;}
}

Вопросы:

  • Я не уверен, что моя политика репозитория - доменная политика - хорошая ставка в долгосрочной перспективе. Если это какой путь я должен идти? (Несколько экземпляров одного и того же объекта Entity или просто возвращаются необходимые свойства)
  • Если я верну необходимые свойства в доменном объекте, не будет ли это своего рода структурой DTO?
  • Если оба моих подхода неверны, может ли кто-нибудь подсказать мне соответствующий пример?

В любом случае, спасибо!

1 Ответ

0 голосов
/ 30 октября 2018
  • Я думаю, что политика возврата объекта из домена репозитория - хорошая ставка, потому что: -

    1. Он будет придерживаться принципа разделения интересов (SoC), т. Е. Ваш уровень хранилища будет работать с объектами домена, а уровень обслуживания - с DTO.
    2. Обеспечивает тестирование модуля кода, чтобы вы могли определить, не нарушается ли он на уровне репозитория или сервиса.
  • Если вы используете политику возврата объекта из домена репозитория, лучше просто возвращать требуемые свойства, так как другие свойства сущности не нужны и это уменьшит избыточность.

  • И для вашего второго вопроса есть разница между DTO и объектами домена. DTO - это то, что может содержать информацию, требуемую на разных уровнях. Предположим, что вашему сервисному уровню требуется вернуть детали адреса и рабочие данные клиентов (оба являются объектами домена). Тогда DTO будет выглядеть так: -

DTO: -

public class CustDTO
{
public string address1{get;set;}
public string address2{get;set;}
public string company{get;set;}
public string location{get;set;}
}

Доменные объекты: -

public class CustAddress
{
public string address1{get;set;}
public string address2{get;set;}
}

public class CustWorkDetials
{
public string company{get;set;}
public string location{get;set;}
}

Таким образом, в основном DTO используются, когда вы хотите передать один агрегатный класс из двух или более классов данного уровня в качестве возвращаемого значения слою над ним в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...