Как отметил Дэвид в своем комментарии, многое из того, что полезно в спецификации, теперь может быть более кратко достигнуто с помощью подобных LINQ.
Вместо нового типа спецификации вы можете создавать произвольные спецификации на лету:
GetCustomers().Where(customer => customer.IsActive && customer.City == "Oakland");
Однако это не полная замена спецификации по нескольким причинам:
- Сортировка / фильтрация происходит в классе потребления после возвращения всех клиентов. Если вы имеете дело с чем-то, кроме объектов в памяти, это неоптимально (LINQ-to-SQL и тому подобное являются исключениями, потому что они компилируют и оптимизируют запросы и выполняют их на стороне сервера / удаленной стороны, возвращая только желаемые результаты ).
- Ваш API широко открыт для любого запроса, если вы выставляете коллекции и оставляете спецификацию для запросов LINQ. Если вы хотите ограничить то, что или сколько можно получить, вам понадобится набор спецификаций для запроса.
Конечно, нет необходимости использовать его повсюду, и вполне возможно, что он вам вообще не понадобится; Я не знаю ваш домен или над чем вы работаете.
Думаю, лучший совет - не смотреть , чтобы использовать его. Вы увидите, когда это оправдано, скорее всего, когда вы начнете писать класс, который выглядит как первый пример в статье, на которую вы ссылались.
Просто храните его в своем хранилище мысленных паттернов, чтобы иметь его, если вам это нужно; если вы никогда не используете его, это только означает, что он вам не нужен, и это нормально.
Выбор слоя зависит от спецификаций и условий использования. Во многих случаях они являются помощниками в поддержке уровня обслуживания, но в некоторых случаях они инкапсулируют доменную логику.
Что касается модульного тестирования, помните, что ваши спецификации являются единицами измерения или содержат единицы измерения. Не тестируйте метод, который принимает спецификацию со всеми возможными комбинациями спецификации; проверьте сами спецификации, чтобы убедиться, что они ведут себя так, как ожидалось, и затем вы можете с уверенностью использовать одни и те же спецификации во многих методах и классах.
Надеюсь, это немного полезно.