Иногда вам нужно определить некоторые бизнес-правила, и шаблон спецификации является полезным инструментом. Например:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
}
Однако я часто обнаруживаю, что мне нужно «протолкнуть» эти правила в SQL, чтобы повысить производительность или удовлетворить такие вещи, как постраничные списки записей.
Затем мне приходится дважды писать код для правил, один раз в коде CLR и один раз в SQL (или на языке ORM).
Как вы относитесь к такой организации кода?
Лучше всего, если код будет храниться вместе в одном классе. Таким образом, если разработчик обновляет бизнес-правила, у него меньше шансов забыть обновить оба набора кода. Например:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
public void AddSql(StringBuilder sql)
{
sql.Append(@"customer.HasLibraryCard
AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE CustomerId = customer.Id)");
}
}
Однако мне это кажется довольно уродливым, поскольку мы сейчас смешиваем проблемы вместе.
Другой альтернативой может быть использование решения Linq-To-YourORM, поскольку код LINQ можно либо запускать для коллекции, либо его можно преобразовать в SQL. Но я обнаружил, что такие решения редко возможны в чем-либо, кроме самых тривиальных сценариев.
Что вы делаете?