Вместо того, чтобы требовать от клиента отправки вам класса, который, как вы ожидаете, будут делать, пусть он отправит вам POCO:
public class SearchCriteria
{
List<string> ResourceNames { get; set; }
// Add more properties here in the future as you identify additional criteria
}
Когда вы добавляете свойства в связанный POCO, люди, использующие более старую версию вашего API, могут по-прежнему работать со своим кодом, если протокол привязки интерпретирует отсутствие свойства, что означает, что свойство не должно быть установлено.
Этот объект, который отправляют клиенты, не будет иметь никакой логики: он играет роль объекта передачи данных. Ваш сервер отвечает за сравнение данных имен ресурсов со своим внутренним словарем, чтобы определить, какие из предоставленных ресурсов доступны.
Обновление
Глядя на предполагаемое использование модели стратегии, я думаю, вы слишком усложняете вещи. Во-первых, я даже не знаю, может ли WCF связываться с различными типами параметров в зависимости от того, какой тип объекта пытается отправить пользователь: конечно, есть, по крайней мере, некоторые привязки (например, JSON), которые этого не позволяют. Даже если это возможно, этот подход кажется неправильным, и пустой интерфейс вызывает серьезный запах кода . Я бы сказал, чтобы интерфейс вашего сервиса был ясным и простым, с четко определенными методами и типами параметров.
Если вы ожидаете, что пользователи будут искать с помощью различных «стратегий», каждая из которых потребует различного набора параметров, создайте свой метод для каждого потенциального алгоритма поиска (SearchByResourceNames(List<string resourceNames)
, SearchByDomain(int domainId)
и т. Д.). .).
С другой стороны, если вы хотите, чтобы пользователь мог смешивать и сопоставлять различные типы критериев, просто используйте SearchCriteria
DTO и позвольте клиенту заполнять любые свойства, по которым он хочет искать.