WCF ( ВКФ ):возвращает только необходимые свойства в json
-
19-09-2019 - |
Вопрос
Из-за настройки производительности я хотел бы возвращать только необходимые свойства.Есть ли возможность / обходной путь?Псевдо / пример кода для понимания:
[DataContract]
public interface IMemberOverview
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
[DataContract]
public interface IMemberDetail
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Status { get; set; }
[DataMember]
public string Infos { get; set; }
}
public class Member : IMemberOverview, IMemberDetail
{
public int Id { get; set; }
public string Name { get; set; }
public string Status { get; set; }
public string Infos { get; set; }
}
и обслуживание:
[OperationContract]
[WebInvoke(
Method = "GET",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "ListMembers")]
[KnownType(typeof(Member))]
public List<IMemberOverview> ListMembers()
{
return MemberDAO.Instance().GetAll();
}
[OperationContract]
[WebInvoke(
Method = "GET",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "Member/{idString}")]
[KnownType(typeof(Member))]
public List<IMemberDetail> Member(string idString)
{
var id = int.Parse(idString);
return MemberDAO.Instance().Get(id);
}
Решение
Если вы хотите предоставить другое представление в своей объектной модели, то самый простой подход - просто предоставить данные в более тонком DTO, т. е.напишите второй класс (обычно в другом пространстве имен) и преобразуйте данные между ними.Либо вручную (напишите какой-нибудь код, возможно, оператор статического преобразования, который делает это), либо с помощью утилит типа PropertyCopy
(вот так).
Наличие отдельного DTO также позволяет вам расширять вашу основную объектную модель, не оказывая незаметного влияния на производительность клиента, и значительно упрощает управление версиями.
Другие советы
Если я правильно понимаю ваш вопрос, [DataMember(EmitDefaultValue=false)] может помочь.