Служба данных WCF удалить поле сущности

Я использую службы данных WCF для предоставления конечных точек OData как части моей службы. Недавно у меня было требование добавить свойство к одному из объектов, но я не хочу, чтобы оно возвращалось как часть службы.

Сначала я использую код. Моя сущность похожа на:

[DataServiceEntity]
public class Customer 
{
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int customer_id { get; set; }

    [Required]
    public string customer_name { get; set; }

    public int customer_hidden { get; set; }
}

Приведенный выше класс является частью моего DbContext, который используется DataService, поэтому является базовой реализацией.

Есть ли способ предотвратить возврат customer_hidden клиенту с помощью какой-либо DataAnnotation?


person eoghank    schedule 21.02.2014    source источник


Ответы (1)


Я бы порекомендовал вам не использовать одни и те же объекты на уровне данных и сервисном уровне, поскольку это создает тесную связь между сервером и клиентом.

Я полагаю, это продемонстрировано в вашем вопросе: вам нужен флаг на стороне сервера, говорящий, что клиент скрыт, информация, к которой клиент не должен иметь доступа.

Вместо этого вы можете использовать DTO на уровне службы (в методах интерфейса службы WCF), которые просто не t содержат это свойство, например

public class CustomerDto
{
  public int customer_id { get; set; }

  public string customer_name { get; set; }
}

Вам понадобится какое-то сопоставление между объектными объектами и DTO, но есть хорошие сторонние библиотеки, которые могут справиться с этим за вас. Я использую Automapper.

Слабая связанность, которую вы получаете благодаря этому подходу, дает вам ряд преимуществ. Представьте, например, что вы расширяете или изменяете объект клиента на стороне сервера и добавляете адресные данные, номера телефонов и т. д. Или переименовываете customer_id в CustomerId. Все эти обновления могут быть скрыты от клиента с помощью этого подхода, вы просто сохраняете сопоставление (в случае добавленных полей) или слегка меняете сопоставление (в случае переименованных полей).

Затем, когда клиент также был обновлен для поддержки новых функций, вы расширяете уровень службы, чтобы включить новые свойства.

Если вы хотите использовать этот подход полностью, вам также следует рассмотреть возможность сопоставления DTO с клиентскими (GUI) сущностями, которые специализированы для использования на стороне клиента. Недавно мне понадобился флаг для клиентского объекта, указывающий, был ли объект напечатан или нет. Такому флагу не место на сервисном уровне или на сервере, но поскольку я создал клиентские объекты, это не проблема.

Недостатком этого подхода может быть то, что свойства, которые вы забыли добавить на сервисном уровне, на стороне клиента оказываются null, но, по моему опыту, такие ошибки довольно легко отследить.

person Daniel Persson    schedule 24.02.2014
comment
Спасибо за ваш ответ, я приму ваш ответ как правильный, однако у меня есть прямой доступ ко многим существующим объектам, и у меня не так много времени для реализации DTO и сопоставлений для них, поэтому мне было интересно, есть ли способ быстро скрыть член класса без подхода DTO? - person eoghank; 25.02.2014
comment
Тогда этот атрибут должен быть тем, что вы ищете: msdn.microsoft.com/en-us/library/ - person Daniel Persson; 25.02.2014