Мое мнение - то, что SOA может быть полезным на макро-уровне, но каждый сервис, вероятно, все еще будет достаточно большим для необходимости в нескольких внутренних компонентах. Внутренние компоненты могут извлечь выгоду из архитектуры OO.
API SOA должен быть определен более тщательно, чем внутренние API, так как это - внешний API. Типы данных, переданные на этом уровне, должны быть максимально простыми без внутренней логики. Если существует некоторая логика, которая тяготеет к типу данных (например, проверка), должен предпочтительно быть один сервис, отвечающий за выполнение логики на типе данных.
Если бы Number было строкой, это было бы просто:
.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))
Поскольку у вас есть число, NHibernate проверит тип Number и, если вы дадите ему строку, выдаст исключение .
Не уверен, почему команда NH не предоставила перегрузку с объектом в качестве параметра и параметрами MatchMode ....
Как бы то ни было, вы все еще можете сделать это так:
.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))
Изменить
О alias:
(я не могу найти, где в документации говорится об этом, но вот мое понимание этого)
{alias} возвращает псевдоним, используемый NH для самого последнего CreateCriteria. Итак, если бы у вас был:
session.CreateCriteria<User>("firstAlias")
.CreateCriteria("firstAlias.Document", "doc")
.Add(Expression.Sql("{alias}.Number like ?", "%2%",
NHibernateUtil.String)).List<User>();
{alias} в этом случае был бы 'doc' - так что вы бы получили: doc.Number.
Итак, всегда используйте {alias} после CreateCriteria, псевдоним которого вам нужно использовать .