Как исключить свойства из сериализации без изменения класса? - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть веб-служба REST WCF, которая возвращает объекты POCO, сгенерированные Entity Framework 4. На основе ContentType HTTP-запроса служба может возвращать XML или JSON.Это именно то, что мне нужно.Однако некоторые объекты имеют слишком много свойств, и я не хочу возвращать все эти данные.Вот как выглядит мой метод прямо сейчас:

public IEnumerable<Task> GetTasks()
{
    Tasks myTasks = ...
    return myTasks;
}

Я не хочу видеть все свойства класса Task, поэтому я вместо этого возвращаю объект XElement.Это дает мне полный контроль над XML, и это работает как шарм.Однако я теряю часть функциональности JSON в WCF.

public XElement GetTasks()
{
    Tasks myTasks = ...
    return new XElement("Tasks", myTasks.Select(a => ToXml(a));
}

Как исключить свойства (без изменения класса, мне могут понадобиться эти свойства в другом методе) без потери ответа XML / JSON, обрабатываемогоWCF?

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

Я согласен с DTO, но я не уверен, что AutoMapper является инструментом для этого сценария.В основном вы хотите вернуть ограниченный набор данных.В мире WCF это означает, что вам нужен другой класс = DTO.AutoMapper - отличный инструмент для отображения одного класса в другой, но это означает, что вы должны загрузить весь объект из базы данных.Но зачем загружать весь объект со всеми его свойствами, если они вам не нужны в запрошенной операции?Вместо этого используйте проекцию Linq-to-entity.Требуется сделать картографию вручную, но это более эффективный подход.

public IEnumerable<TaskDto> GetTasks()
{
    return context.Tasks.Select(t => new TaskDto
        {
            Name = t.Name,
            DueDate = t.DueDate
        }).AsEnumerable(); 
}
0 голосов
/ 09 апреля 2011

Вы можете использовать объект DTO, а затем отобразить карту между моделью и этим объектом. AutoMapper является отличной основой для этого:

public IEnumerable<TaskDto> GetTasks()
{
    IEnumerable<Task> myTasks = ...
    IEnumerable<TaskDto> tasks = Mapper.Map<IEnumerable<Task>, IEnumerable<TaskDto>>(myTasks);
    return tasks;
}

Не стесняйтесь включать любые свойства, которые вам нужны в этом объекте.

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