Итак, я предполагаю, что мы действительно сосредоточены на этом наборе строк:
if (spec.IsSatisfiedBy(item))
return new NewStatusUpdate();
и я предполагаю, что вы спрашиваете, как в этой текущей форме это можно сделать. Кажется, что элемент должен поддерживать как
interface ISpecSupport<T>
{
bool ItemSpecsContain(ISpecification<T> spec);
}
Тогда метод spec.IsSatisfiedBy может взять этот тип интерфейса и запустить метод.
Другими словами, я предполагаю, что говорю, что объект должен нести какое-то описание того, чем он является (в терминах спецификаций). Я предполагаю, что это какой-то список, но я не уверен. Я уверен, что вы, наверное, подумали об этом, так что если вы можете добавить что-нибудь полезное.
Кроме того, вместо вышесказанного, возможно, вы могли бы изменить его так:
if (item.Satisfies(spec))
return new NewStatusUpdate();
Тогда, таким образом, вам не нужно использовать очень злобный шаблон посетителей (я думаю, это то, что я описывал до этого). Это более прямолинейно, поскольку кажется, что предмету принадлежат спецификации, и таким образом вы позволяете предмету решать, соответствует ли он спецификации.
Если вы не хотите, чтобы эта логика хранилась внутри объекта (что я бы понял) И вы используете какую-то сумку свойств (или вы круты с отражением), вы можете углубиться в детали объекта с помощью независимый валидатор спецификаций. На самом деле, независимый валидатор не может быть плохой идеей для начала. Я не уверен, что способность знать, соответствует ли спецификация предмету, является обязанностью, которая должна оставаться за индивидуальной спецификацией.