Вопрос

Из-за настройки производительности я хотел бы возвращать только необходимые свойства.Есть ли возможность / обходной путь?Псевдо / пример кода для понимания:

[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)] может помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top