Я бы порекомендовал вам не использовать одни и те же объекты на уровне данных и сервисном уровне, поскольку это создает тесную связь между сервером и клиентом.
Я полагаю, это продемонстрировано в вашем вопросе: вам нужен флаг на стороне сервера, говорящий, что клиент скрыт, информация, к которой клиент не должен иметь доступа.
Вместо этого вы можете использовать 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