Руководство по Catharsis - часть 3: быстрая разработка приложений - Бизнес-правила
ОГЛАВЛЕНИЕ
Бизнес-правила
Большинство приложений требует применения некоторых бизнес-правил при работе с объектами. Например, если есть клиент, имеющий ‘Германия’ в качестве Country, нельзя позволять системе удалять страну Германия из списка доступных стран. Это может привести к ситуации, при которой объект использует объект, больше не существующий в системе. Это похоже на целостность данных по внешнему ключу на уровне базы данных. Мы не поручаем базе данных слежение за этим, поскольку более эффективно обрабатывать такие ситуации в коде, и ниже показано, как это делается.
Бизнес-правила применяются на бизнес-фасаде, который можно найти в показанном здесь месте:
Чтобы обеспечить соблюдение бизнес-правила, запрещающего удалять страну, если она используется клиентом, необходимо заставить CountryFacade спрашивать ClientFacade, используют ли какие-либо клиенты страну, которую пытаются удалить.
Это включает четыре шага.
- Метод ‘CheckDelete (проверка удаления)’ в CountryFacade должен быть переопределен, и перед удалением страны должна выполняться проверка, допустимо ли ее удаление.
- Проверка в переопределенном методе CheckDelete должна вызывать другой метод в ClientFacade, чтобы проверить, используется ли страна клиентом.
- Интерфейс фасада клиента (IClientfacade) должен быть расширен при помощи метода ‘IsCountryInUse’ (используется ли страна (Country))
- Метод IsCountryInUse должен быть реализован в ClientFacade.
Начинаем с открытия CountryFacade и добавления следующего кода:
/// <summary>
/// Нужно проверить, используется ли данный объект!
/// если любой другой объект использует этот экземпляр, удаление останавливается и добавляется сообщение об ошибке
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
protected override bool CheckDelete(Country entity)
{
var result = base.CheckDelete(entity);
if (ClientFacade.IsCountryInUse(entity))
{
Messages.AddError(this, Str.Messages.Keys.CannotDeleteItem, Str.Messages.Templates.CannotDelete1
, entity.ToDisplay());
result = false;
}
return result;
}
Этот метод использует ClientFacade, поэтому нужно добавить локальный член _фасад клиент.
#region members
IClientFacade _clientFacade;
#endregion members
Также нужно свойство для ClientFacade:
#region properties
/// <summary>
/// Позволяет задавать агента при помощи регистрации
/// </summary>
public virtual IAgentFacade AgentFacade
{
protected get
{
if (_agentFacade.IsNull())
{
_agentFacade = FacadeFactory.CreateFacade<IAgentFacade>(Messages);
}
return _agentFacade;
}
set
{
Check.Require(value.Is(), " IAgentFacade cannot be null");
_agentFacade = value;
}
}
#endregion properties
Вышеуказанный метод CheckDelete вызывает метод IsCountryInUse и определяет, исходя из результатов этого вызова, можно ли удалить страну.
IsCountryInUse должен быть добавлен в IClientFacade:
/// <summary>
/// Позволяет выполнять проверку перед удалением.
/// Существует ли какой-либо агент, использующий экземпляр объекта в качестве страны
/// </summary>
/// <param name="entity"></param>
/// <returns>истина, если используется</returns>
bool IsCountryInUse(Country entity);
Учтите, что необходимо добавить директиву using (использовать), чтобы интерфейс имел доступ к пространству имен списка кодов, так как ему нужен доступ к объекту Country:
Вышеуказанная директива using также должна быть добавлена в ClientFacade.
using Firm.SmartControls.Entity.CodeLists;
Теперь будет реализован метод IsCountryInUse в ClientFacade.
#region IClientFacade
/// <summary>
/// Выполняет проверку перед тем, как произойдет удаление.
/// Существуют ли какие-либо клиенты, использующие экземпляр объекта в качестве страны
/// </summary>
/// <param name="entity"></param>
/// <returns>истина, если используется</returns>
public virtual bool IsCountryInUse(Country entity)
{
var item = Dao.GetBySearch(new ClientSearch()
{
MaxRowsPerPage = 1,
Example = new Client()
{
Country = entity
}
}).FirstOrDefault();
if (item.Is())
{
Messages.AddWarning(this, Str.Messages.Keys.ItemInUse, Str.Messages.Templates.ItemIsUsedForEntity3
, entity.ToDisplay(), item.ToDisplay(), Str.Controllers.Country);
return true;
}
return false;
}
#endregion IClientFacade
Теперь можно тестировать код. Запустите приложение и щелкните мышью по клиентам, чтобы увидеть список текущих клиентов.
Можно увидеть, что Ирландия используется в качестве страны, поэтому откройте ветвь списков кодов навигационного дерева и щелкните мышью по стране. Можно использовать красный крестик рядом со страной Ирландия, чтобы попытаться удалить ее. Удаление не выполнится из-за бизнес-правила, которое было добавлено. Учтите, что сообщения об ошибках могут быть отформатированы по-разному, в зависимости от вашего желания.
Бизнес-правила можно использовать для контроля над тем, что разрешено во время добавления или обновления объекта.
Вывод
Теперь вы должны понимать, как добавлять новые объекты в пример решения, связывать их с другими объектами (списками кодов) и добавлять некоторые элементарные бизнес-правила. Используя информацию и указания в первой статье из этой серии, вы должны уметь создавать новую базу данных в SQL Server и быстро разрабатывать веб-приложение CRUD при помощи каркаса приложений Catharsis.
В будущих руководствах в этой серии будет рассмотрен поиск и устранение некоторых проблем, с которыми сталкивались пользователи каркаса Catharsis, будет более глубоко рассмотрено использование Catharsis и создано больше примеров приложений.