• Microsoft .NET
  • ASP.NET
  • Руководство по Catharsis - часть 3: быстрая разработка приложений

Руководство по Catharsis - часть 3: быстрая разработка приложений - Бизнес-правила

ОГЛАВЛЕНИЕ

Бизнес-правила

Большинство приложений требует применения некоторых бизнес-правил при работе с объектами. Например, если есть клиент, имеющий ‘Германия’ в качестве Country, нельзя позволять системе удалять страну Германия из списка доступных стран. Это может привести к ситуации, при которой объект использует объект, больше не существующий в системе. Это похоже на целостность данных по внешнему ключу на уровне базы данных. Мы не поручаем базе данных слежение за этим, поскольку более эффективно обрабатывать такие ситуации в коде, и ниже показано, как это делается.

Бизнес-правила применяются на бизнес-фасаде, который можно найти в показанном здесь месте:



Чтобы обеспечить соблюдение бизнес-правила, запрещающего удалять страну, если она используется клиентом, необходимо заставить CountryFacade спрашивать ClientFacade, используют ли какие-либо клиенты страну, которую пытаются удалить.
Это включает четыре шага.

  1. Метод ‘CheckDelete (проверка удаления)’ в CountryFacade должен быть переопределен, и перед удалением страны должна выполняться проверка, допустимо ли ее удаление.
  2. Проверка в переопределенном методе CheckDelete должна вызывать другой метод в ClientFacade, чтобы проверить, используется ли страна клиентом.
  3. Интерфейс фасада клиента (IClientfacade) должен быть расширен при помощи метода ‘IsCountryInUse’ (используется ли страна (Country))
  4. Метод 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 и создано больше примеров приложений.