Конвертация объектов в DTO
От: Аноним  
Дата: 15.07.11 07:11
Оценка:
Задача следующая:
в контроллер необходимо создать DTO объекты для объектов из list`а. Список содержит объекты двух подтипов.
Вопрос как правильно вызвать методы конвертации конкретных подтипов?
У меня пока мысли пришли только к одному:


List<BaseType> list=.....;
foreach(var item in list)
{

if(item is SubType1)
{
 конвертим ......
}
else if(item is SubType2)
{
......
}



Попинайте, может есть более правильное решение.
Re: Конвертация объектов в DTO
От: motormanyak Земля  
Дата: 15.07.11 07:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача следующая:

А>в контроллер необходимо создать DTO объекты для объектов из list`а. Список содержит объекты двух подтипов.
А>Вопрос как правильно вызвать методы конвертации конкретных подтипов?

Может как-то так

class BaseType
{
   public virtual string Convert()
  {
  ....
  }
}
class SubClass1
{
  override public string Convert()
  {
  .....
  }
}



List<BaseType> list=.....;
foreach (var item in list)
{
 item.Convert();
}


или я что-то не так понял
In God We Trust
Re[2]: Конвертация объектов в DTO
От: Аноним  
Дата: 15.07.11 07:53
Оценка:
M>Может как-то так

M>
M>class BaseType
M>{
M>   public virtual string Convert()
M>  {
M>  ....
M>  }
M>}
M>class SubClass1
M>{
M>  override public string Convert()
M>  {
M>  .....
M>  }
M>}
M>



M>
M>List<BaseType> list=.....;
M>foreach (var item in list)
M>{
M> item.Convert();
M>}
M>


M>или я что-то не так понял


Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.
Re[3]: Конвертация объектов в DTO
От: uzhas Ниоткуда  
Дата: 15.07.11 08:16
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.


могу порекомендовать использовать visitor, чтобы избавиться от "is"
вы задали слишком асбтрактный вопрос, поэтому на него можно дать лишь абстрактный ответ
1) вариант с is может быть нормальным
2) вариант с вищитором тоже может подойти
3) вариант с наследованием тоже вполне пригоден
вы не описали что вы понимаеме под DTO, будет ли DTO для subClass1 совпадать с DTO для subClass2, что вы вкладываете в понятие DTO ? это структура без поведения или это набор байт и вы выполняете сериализацию?
можно делать так
object->Save(outputStream)
object->Read(inputStream)

можно делать так
Save(object, outputStream);
Read(object, inputStream);

можно так
outputStream->Save(MakeBlob(object));
Blob chunk = inputStream->ReadNextChunk();
object->Read(chunk);

выбор большой
Re[3]: Конвертация объектов в DTO
От: motormanyak Земля  
Дата: 15.07.11 08:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.


какого такого домена??? в первом посте нет ни слова ни о каких доменах и слоях.....
какой вопрос, такой и ответ: как конвертировать объекты? — берем и конвертируем.
или я опять что-то пропустил?

и вообще не понятно что ты понимаешь под DTO объектом
пока, из всего написанного, я понял только то что надо сериализовать какой-то объект. так может можно сериализацию прописать прям внутри BaseClass? или для каждого наследника BaseClass надо создавать свой DTOClass? а может еще вообще можно обойтись каким-нибудь Helper методом, где рефлексией проходить по публичным полям и складывать в XML.
In God We Trust
Re[4]: Конвертация объектов в DTO
От: motormanyak Земля  
Дата: 15.07.11 08:33
Оценка: :)
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Аноним, Вы писали:


А>>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.


U>могу порекомендовать использовать visitor, чтобы избавиться от "is"

U>вы задали слишком асбтрактный вопрос, поэтому на него можно дать лишь абстрактный ответ
U>1) вариант с is может быть нормальным
U>2) вариант с вищитором тоже может подойти
U>3) вариант с наследованием тоже вполне пригоден
U>вы не описали что вы понимаеме под DTO, будет ли DTO для subClass1 совпадать с DTO для subClass2, что вы вкладываете в понятие DTO ? это структура без поведения или это набор байт и вы выполняете сериализацию?
U>можно делать так
U>
U>object->Save(outputStream)
U>object->Read(inputStream)
U>

U>можно делать так
U>
U>Save(object, outputStream);
U>Read(object, inputStream);
U>

U>можно так
U>
U>outputStream->Save(MakeBlob(object));
U>Blob chunk = inputStream->ReadNextChunk();
U>object->Read(chunk);
U>

U>выбор большой

uzhas

сори, увидел твой пост, когда уже отправил свой. получилось почти одно и тоже
In God We Trust
Re[4]: Конвертация объектов в DTO
От: Аноним  
Дата: 15.07.11 09:31
Оценка:
Здравствуйте, motormanyak, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.


M>какого такого домена??? в первом посте нет ни слова ни о каких доменах и слоях.....

M>какой вопрос, такой и ответ: как конвертировать объекты? — берем и конвертируем.
M>или я опять что-то пропустил?

M>и вообще не понятно что ты понимаешь под DTO объектом

M>пока, из всего написанного, я понял только то что надо сериализовать какой-то объект. так может можно сериализацию прописать прям внутри BaseClass? или для каждого наследника BaseClass надо создавать свой DTOClass? а может еще вообще можно обойтись каким-нибудь Helper методом, где рефлексией проходить по публичным полям и складывать в XML.


Имеем:
1) Domain Model (Reach)
2) Приложение построенное по шаблону MVC.

В контроллере на основании доменных сущностей создаются DTO объекты для передачи во вью.
Метод выполняющий эту операцию список объектов базового типа. Маппинг сущностей в DTO осуществляется AutoMapper`ом.
Задача осталась та-же:
как правильно вызвать методы конвертации конкретных подтипов к объекту DTO? Структура DTO одна для обоих типов.
Как вариант:

List<BaseType> list=.....;
foreach(var item in list)
{

if(item is SubType1)
{
 конвертим ......
}
else if(item is SubType2)
{
......
}

Но может есть еще предложения.
Re[5]: Конвертация объектов в DTO
От: motormanyak Земля  
Дата: 15.07.11 11:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеем:

А>1) Domain Model (Reach)
А>2) Приложение построенное по шаблону MVC.

А>В контроллере на основании доменных сущностей создаются DTO объекты для передачи во вью.

А>Метод выполняющий эту операцию список объектов базового типа. Маппинг сущностей в DTO осуществляется AutoMapper`ом.
А>Задача осталась та-же:
А>как правильно вызвать методы конвертации конкретных подтипов к объекту DTO? Структура DTO одна для обоих типов.

ну теперь понятно (что ничего не понятно).

A>Маппинг сущностей в DTO осуществляется AutoMapper`ом

A>Структура DTO одна для обоих типов.

а так сделать не получится?

Mapper.Map<BaseClass, DTOClass>(item)

ведь item в любом случае является BaseClass.
ну, а если ты определяешь разную конфигурацию мапера для разных подклассов, то тут только твой вариант. можно только это вынести в некий класс-обертку (чтоб код не засирать), где и будет происходить проверка типа элемента.
In God We Trust
Re[5]: Конвертация объектов в DTO
От: uzhas Ниоткуда  
Дата: 15.07.11 13:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В контроллере на основании доменных сущностей создаются DTO объекты для передачи во вью.

А>Метод выполняющий эту операцию список объектов базового типа. Маппинг сущностей в DTO осуществляется AutoMapper`ом.
А>Задача осталась та-же:
А>как правильно вызвать методы конвертации конкретных подтипов к объекту DTO? Структура DTO одна для обоих типов.
работайте через базовый класс. (даже визиторы не нужны и is)
просверлите нужные методы, чтобы любой ребенок мог сообщить свои данные для построения DTO, который будет отображаться (как я понимаю)
можно выдавать map атрибутов, которые легко в DTO засунуть
каждый ребенок будет выдавать свои атрибуты
Re: Конвертация объектов в DTO
От: Ziaw Россия  
Дата: 18.07.11 06:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Попинайте, может есть более правильное решение.


Одним из альтернативных решений является декларативная настройка object2object маппера. Что является более правильным можно определить только в разрезе конкретная задача/конкретные исполнители.
Re[2]: Конвертация объектов в DTO
От: Аноним  
Дата: 18.07.11 08:10
Оценка:
Z>Одним из альтернативных решений является декларативная настройка object2object маппера. Что является более правильным можно определить только в разрезе конкретная задача/конкретные исполнители.

Конкретная задача: иерархия клиентов (базовый класс, 2 подкласса юр. и физ. клиент), нужно выводить во вью список всех клиентов. Список должен содержать "имя" клиентов, но у подклассов оно хранится в разных аттрибутах. Для вывода юрлиц берется CompanyName, а для физлиц склеивается FirstName и LastName.

Сущности:
 public abstract class Client 
 }
public int Id{get;set;}
......
 } 

public UrClient:Client 
{
public string CompanyName{get;set;}
......
}



public FizClient:Client 
{
public string FirstName{get;set;}
public string LastName{get;set;}
......
}


Где-то в контроллере:

public List<ClientDTO> GetClients
{
List<Clients> clients=get Clients from ....

и здесь нужно привести клиентов к общему DTO
}
Re[3]: Конвертация объектов в DTO
От: uzhas Ниоткуда  
Дата: 18.07.11 10:01
Оценка:
Здравствуйте, Аноним, Вы писали:

Z>>Одним из альтернативных решений является декларативная настройка object2object маппера. Что является более правильным можно определить только в разрезе конкретная задача/конкретные исполнители.


А>Конкретная задача: иерархия клиентов (базовый класс, 2 подкласса юр. и физ. клиент), нужно выводить во вью список всех клиентов. Список должен содержать "имя" клиентов, но у подклассов оно хранится в разных аттрибутах. Для вывода юрлиц берется CompanyName, а для физлиц склеивается FirstName и LastName.


первый пример:
А>Сущности:
А>
А> public abstract class Client 
А> }
А>public int Id{get;set;}
public string GetName()
А>......
А> } 

А>public UrClient:Client 
А>{
А>public string CompanyName{get;set;}
public string GetName() { return CompanyName(); }
А>......
А>}



А>public FizClient:Client 
А>{
А>public string FirstName{get;set;}
А>public string LastName{get;set;}
public string GetName() { return FirstName() + LastName(); }
А>}
А>


А>Где-то в контроллере:


А>public List<ClientDTO> GetClients

А>{
А>List<Clients> clients=get Clients from ....

А>и здесь нужно привести клиентов к общему DTO

вот так
  foreach c in clients
  {
    c.GetName();
  }

А>}

второй пример: делайте визитор и им обходите своих Clients
Visitor
{
  OnFizClient(FixClient c)
  {
    Name = c.Firstname() + c.LastName();
  }
  OnUrClient(UrClient c)
  {
    Name = c.CompanyName();
  }  
}


ну или кастьте, как в первом посте написано, все равно работает
Re[4]: Конвертация объектов в DTO
От: Аноним  
Дата: 18.07.11 12:15
Оценка:
Здравствуйте, uzhas, Вы писали:

U>первый пример:

А>>Сущности:
А>>
А>> public abstract class Client 
А>> }
А>>public int Id{get;set;}
U>public string GetName()
А>>......
А>> } 

А>>public UrClient:Client 
А>>{
А>>public string CompanyName{get;set;}
U>public string GetName() { return CompanyName(); }
А>>......
А>>}

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

А>>public FizClient:Client 
А>>{
А>>public string FirstName{get;set;}
А>>public string LastName{get;set;}
U>public string GetName() { return FirstName() + LastName(); }
А>>}
А>>


А>>Где-то в контроллере:


А>>public List<ClientDTO> GetClients

А>>{
А>>List<Clients> clients=get Clients from ....

А>>и здесь нужно привести клиентов к общему DTO

U>вот так
U>
U>  foreach c in clients
U>  {
U>    c.GetName();
U>  }
U>

А>>}

U>второй пример: делайте визитор и им обходите своих Clients

U>
U>Visitor
U>{
U>  OnFizClient(FixClient c)
U>  {
U>    Name = c.Firstname() + c.LastName();
U>  }
U>  OnUrClient(UrClient c)
U>  {
U>    Name = c.CompanyName();
U>  }  
U>}
U>


U>ну или кастьте, как в первом посте написано, все равно работает


Так получается, что модель знает о слое котором она знать не должна или я не прав?
Re[4]: Конвертация объектов в DTO
От: Аноним  
Дата: 18.07.11 12:35
Оценка:
Здравствуйте, uzhas, Вы писали:

Не много не правильно комент вставил.

U>первый пример:

А>>Сущности:
А>>
А>> public abstract class Client 
А>> }
А>>public int Id{get;set;}
U>public string GetName()
А>>......
А>> } 

А>>public UrClient:Client 
А>>{
А>>public string CompanyName{get;set;}
U>public string GetName() { return CompanyName(); }
А>>......
А>>}



А>>public FizClient:Client 
А>>{
А>>public string FirstName{get;set;}
А>>public string LastName{get;set;}
U>public string GetName() { return FirstName() + LastName(); }
А>>}
А>>


А>>Где-то в контроллере:


А>>public List<ClientDTO> GetClients

А>>{
А>>List<Clients> clients=get Clients from ....

А>>и здесь нужно привести клиентов к общему DTO

U>вот так
U>
U>  foreach c in clients
U>  {
U>    c.GetName();
U>  }
U>

А>>}



А>> public abstract class Client

А>> }
А>>public int Id{get;set;}
U>public string GetName()
А>>......
А>> }

А>>public UrClient:Client

А>>{
А>>public string CompanyName{get;set;}
U>public string GetName() { return CompanyName(); }
А>>......
А>>}

Таких свойств у сущности будет очень много, т.к. для разных вью формат различается.
GetName, GetShortName, Get.....
Re[5]: Конвертация объектов в DTO
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 18.07.11 18:00
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Как вариант:


А>
А>List<BaseType> list=.....;
А>foreach(var item in list)
А>{

А>if(item is SubType1)
А>{
А> конвертим ......
А>}
А>else if(item is SubType2)
А>{
А>......
А>}
А>

А>Но может есть еще предложения.

Зачем для этих доменных сущностей нужен базовый класс, если они потом обрабатываются по-разному?
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: Конвертация объектов в DTO
От: pagrus  
Дата: 24.07.11 23:25
Оценка:
В java я бы сделал что-нибудь такое:

for(BaseType item: list) {
Mapper mapper = mapperResolver.resolve(item.getClass());
DTO myDto = mapper.map(item);
}

Т.е. две дополнительные абстрации:
* Mapper — компонент, который умеет конвертировать сущность в DTO.
* MapperResolver — компонент, который умеет выбирать правильный Mapper для заданного типа объекта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.