Задача следующая:
в контроллер необходимо создать DTO объекты для объектов из list`а. Список содержит объекты двух подтипов.
Вопрос как правильно вызвать методы конвертации конкретных подтипов?
У меня пока мысли пришли только к одному:
List<BaseType> list=.....;
foreach(var item in list)
{
if(item is SubType1)
{
конвертим ......
}
else if(item is SubType2)
{
......
}
Здравствуйте, Аноним, Вы писали:
А>Задача следующая: А>в контроллер необходимо создать DTO объекты для объектов из list`а. Список содержит объекты двух подтипов. А>Вопрос как правильно вызвать методы конвертации конкретных подтипов?
Может как-то так
class BaseType
{
public virtual string Convert()
{
....
}
}
class SubClass1
{
override public string Convert()
{
.....
}
}
List<BaseType> list=.....;
foreach (var item in list)
{
item.Convert();
}
Здравствуйте, Аноним, Вы писали:
А>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.
могу порекомендовать использовать visitor, чтобы избавиться от "is"
вы задали слишком асбтрактный вопрос, поэтому на него можно дать лишь абстрактный ответ
1) вариант с is может быть нормальным
2) вариант с вищитором тоже может подойти
3) вариант с наследованием тоже вполне пригоден
вы не описали что вы понимаеме под DTO, будет ли DTO для subClass1 совпадать с DTO для subClass2, что вы вкладываете в понятие DTO ? это структура без поведения или это набор байт и вы выполняете сериализацию?
можно делать так
Здравствуйте, Аноним, Вы писали:
А>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.
какого такого домена??? в первом посте нет ни слова ни о каких доменах и слоях.....
какой вопрос, такой и ответ: как конвертировать объекты? — берем и конвертируем.
или я опять что-то пропустил?
и вообще не понятно что ты понимаешь под DTO объектом
пока, из всего написанного, я понял только то что надо сериализовать какой-то объект. так может можно сериализацию прописать прям внутри BaseClass? или для каждого наследника BaseClass надо создавать свой DTOClass? а может еще вообще можно обойтись каким-нибудь Helper методом, где рефлексией проходить по публичным полям и складывать в XML.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Аноним, Вы писали:
А>>Я думал что не хорошо,если сущность домена будет знать как она конвертируется в объекты DTO, т.е. слой о котором она даже знать не должна.
U>могу порекомендовать использовать visitor, чтобы избавиться от "is" U>вы задали слишком асбтрактный вопрос, поэтому на него можно дать лишь абстрактный ответ U>1) вариант с is может быть нормальным U>2) вариант с вищитором тоже может подойти U>3) вариант с наследованием тоже вполне пригоден U>вы не описали что вы понимаеме под DTO, будет ли DTO для subClass1 совпадать с DTO для subClass2, что вы вкладываете в понятие DTO ? это структура без поведения или это набор байт и вы выполняете сериализацию? U>можно делать так U>
сори, увидел твой пост, когда уже отправил свой. получилось почти одно и тоже
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)
{
......
}
Здравствуйте, Аноним, Вы писали:
А>Имеем: А>1) Domain Model (Reach) А>2) Приложение построенное по шаблону MVC.
А>В контроллере на основании доменных сущностей создаются DTO объекты для передачи во вью. А>Метод выполняющий эту операцию список объектов базового типа. Маппинг сущностей в DTO осуществляется AutoMapper`ом. А>Задача осталась та-же: А>как правильно вызвать методы конвертации конкретных подтипов к объекту DTO? Структура DTO одна для обоих типов.
ну теперь понятно (что ничего не понятно).
A>Маппинг сущностей в DTO осуществляется AutoMapper`ом A>Структура DTO одна для обоих типов.
а так сделать не получится?
Mapper.Map<BaseClass, DTOClass>(item)
ведь item в любом случае является BaseClass.
ну, а если ты определяешь разную конфигурацию мапера для разных подклассов, то тут только твой вариант. можно только это вынести в некий класс-обертку (чтоб код не засирать), где и будет происходить проверка типа элемента.
Здравствуйте, Аноним, Вы писали:
А>В контроллере на основании доменных сущностей создаются DTO объекты для передачи во вью. А>Метод выполняющий эту операцию список объектов базового типа. Маппинг сущностей в DTO осуществляется AutoMapper`ом. А>Задача осталась та-же: А>как правильно вызвать методы конвертации конкретных подтипов к объекту DTO? Структура DTO одна для обоих типов.
работайте через базовый класс. (даже визиторы не нужны и is)
просверлите нужные методы, чтобы любой ребенок мог сообщить свои данные для построения DTO, который будет отображаться (как я понимаю)
можно выдавать map атрибутов, которые легко в DTO засунуть
каждый ребенок будет выдавать свои атрибуты
Здравствуйте, Аноним, Вы писали:
А>Попинайте, может есть более правильное решение.
Одним из альтернативных решений является декларативная настройка 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 ....
Здравствуйте, Аноним, Вы писали:
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 List<ClientDTO> GetClients А>>{ А>>List<Clients> clients=get Clients from ....
А>>и здесь нужно привести клиентов к общему DTO U>вот так U>
U> foreach c in clients
U> {
U> c.GetName();
U> }
U>
Т.е. две дополнительные абстрации:
* Mapper — компонент, который умеет конвертировать сущность в DTO.
* MapperResolver — компонент, который умеет выбирать правильный Mapper для заданного типа объекта.