Table of Contents
Руководство разработчика
Пространства имен
Все пространства имен образуются путем добавления к общей части названия DevPark.Cloud названия конкретного модуля через точку. В проекте используются следующие пространства имен:
- Devpark.Cloud.CC.Module.BusinessObjects - пространство имен, в котором описываются все бизнес объекты модуля ClientCenter.
- DevPark.Cloud.СС.Module.Enums - пространство имен перечислений.
- DevPark.Cloud.СС.Module.BusinesLogics - пространство имен, в котором описываются классы, содержащие бизнес-логику.
- DevPark.Cloud.СС.Module.Web.Controllers - пространство имен, в котором описываются классы контроллеров приложения для управления пользователями системы.
- DevPark.Cloud.СС.Module.Web.Controllers.Editors - пространство имен, в котором описываются классы редакторов приложения для управления пользователями системы.
- DevPark.Cloud.CC.Module.Utils - пространство имен вспомогательных классов.
- Devpark.Cloud.WS - пространство имен веб-службы, предназначенной для связи пользователя системы с центральной базой данных (веб-служба).
- DevPark.Cloud.UI.Widgets.Common - пространство имен для виджетов общего назначения (регистрация, вход).
- DevPark.Cloud.UI.Widgets.Fitness - пространство имен для виджетов ориентированных на систему управления фитнесом.
- DevPark.Cloud.UI.Widgets.Lobix - пространство имен для виджетов ориентированных на систему Lobix.
- DevPark.Cloud.Tests.VCTests - пространство имен для тестов контроллеров.
- DevPark.Cloud.Tests.ObjectTests - пространство имен для тестов объектов.
- DevPark.Clouds.Tests.BLTests - пространство имен для тестирования бизнес-логики.
- DevPark.Cloud. - пространство имен для общих классов для всех приложений
Структура решения
Список проектов в решении
- DevPark.Cloud.CC.Module - проект, содержащий описание бизнес объектов и бизнес логики для приложения управления пользователями системы.
- DevPark.Cloud.CC.Module.Web - проект, содержащий классы контроллеров приложения для управления пользователями системы.
- DevPark.Cloud.CC.Web - проект ASP приложения для управления пользователями системы.
- DevPark.Cloud.UI - проект, для предоставления интерфейса пользователя (виджеты) и связи с центральной базой данных.
- DevPark.Cloud.Tests - проект содержащий тесты NUnit.
Структура проекта DevPark.Clouds.CC.Module
- BusinessObjects - папка для файлов классов бизнес-объектов.
- Enums - папка для хранения файлов перечислений
- Controllers - папка для файлов классов контроллеров.
- BuisnessLogics - папка для файлов классов содержащих бизнес-логику.
- Images - папка для файлов изображений.
- EmbededReports - папка для файлов отчетов.
- SQL - папка для файлов хранимых процедур.
- Utils - папка для файлов вспомогательных классов.
Структура проекта DevPark.Clouds.CC.Module.Web
- Controllers - папка для файлов классов контроллеров, содержащих специфичный, ориентированный на Web код.
- Editors - папка для классов пользовательских редакторов.
- Images - папка для хранения изображений.
Структура проекта DevPark.Clouds.Tests
- ObjectTests - папка для классов тестов объектов.
- BuisnessLogicsTests - папка для классов тестов бизнес-логики.
- ControllerTests - папка для классов тестов контроллеров.
- Utils - папка для классов поддержки системы тестирования.
Структура проекта DevPark.Cloud
Проект содержит классы которые должны быть во всех приложениях. Например работа с шаблонами, с системой сообщений.
- Notifications.BussinessObjects - папка для файлов классов бизнес-объектов.
- Notifications.Enums - папка для хранения файлов перечислений
- Notifications.Controllers - папка для файлов классов контроллеров
- Notifications.BuisnessLogics - папка для файлов классов содержащих бизнес-логику.
Правила разработки
Правила настройки интерфейса
<note important>
- Настройка интерфейса должна осуществляться через атрибуты. Необходимо использовать Model.DesignedDiffs.xafml в проекте DevPark.Cloud.CC.Module.Web.
</note>
Атрибуты настройки
Атрибуты класса:
[VisibleInReport] - показывать в отчетах.
[XafDisplayNameAttribute] - отображаемое имя объекта.
[ImageNameAttribute] - изображение для объекта.
[XafDefaultPropertyAttribute] - поле по-умолчанию.
[ModelDefault…] - настройки разрешений на создание, удаление, редактирование, заголовок. Пример: ModelDefault(“AllowDelete”, “false”)
[MapInheritance(MapInheritanceType.ParentTable)] - родительская таблица.
[RuleRequiredField…] - поля, обязательные к заполнению.
[Appearance…] - поведение полей (visible, hide, e.t.c)
Атрибуты полей:
[ModelDefault(“Caption”, “Account name”)] - заголовок поля.
[ModelDefault(“DisplayFormat”, “{0:F4}”)] - формат отображения.
[ModelDefault(“EditMask”, “F4”)] - маска редактирования.
[ModelDefault(“AllowEdit”, “False”)] - разрешение на редактирование.
[Browsable(false)] - видимость поля.
VisibleInLookupListViewAttribute - показывать в Lookup View.
VisibleInListViewAttribute - показывать в List View.
VisibleInDetailViewAttribute - показывать в Detail View.
[NonPersistent] - поле не сохраняется в базе.
[Persistent(“AccountCategoryId”)] - название столбца в таблице базы данных.
[ImmediatePostData] - немедленное обновление всех полей при изменении текущего.
[Size(100)] - размер поля (для String - длина строки).
[LookupEditorMode(LookupEditorMode.AllItems)] - режим редактирования при просмотре в Lookup
[NullValue()] - нулевое значение поля
Атрибуты правил:
Описание атрибутов правил здесь: http://documentation.devexpress.com/#Xaf/CustomDocument3008
Правила добавления бизнес-объектов
<note important>
- Бизнес-объекты приложения для управления пользователями (ClientCenter) добавляются в проект DevPark.Clouds.CC.Module в папку BuisnessObjects
- Для добавления объекта следует использовать шаблон DXperience v12.1 Domain Object (Code only).
Список обязательных атрибутов класса:
- XafDisplayNameAttribute - отображаемое имя объекта.
- ImageNameAttribute - изображение для объекта.
- XafDefaultPropertyAttribute - поле по-умолчанию.
- [MapInheritance(MapInheritanceType.ParentTable)] - для производных классов.
Список обязательных атрибутов поля:
- XafDisplayNameAttribute - отображаемое имя поля.
- ToolTipAttribute - всплывающая подсказка
- VisibleInLookupListViewAttribute - показывать в Lookup View.
- VisibleInListViewAttribute - показывать в List View.
- VisibleInDetailViewAttribute - показывать в Detail View.
- SizeAttribute - размер поля (обязателен для полей типа String).
- ModelDefault(“DisplayFormat”, …) - формат отображения (обязателен для полей типа DateTime).
- ModelDefault(“EditMask”, …) - маска редактирования (обязателен для полей типа DateTime).
</note>
Правила добавления контроллеров
<note important>
- Для одной сущности должен существовать только один контроллер.
- Контроллеры по возможности необходимо добавлять в проект DevPark.Cloud.CC.Module папка Controllers. Если это невозможно т.к. необходим доступ к сборкам Web, контроллер следует добавлять в проект DevPark.Cloud.CC.Module.Web папка Controllers.
- Перед добавлением нового контроллера необходимо убедится, что уже не существует аналогичный.
- Правило образования имени контроллера: Название объекта + VC
- Поле Name в Action должно начинаться с сокращенного обозначения типа Action (SimpleAction - sa, ParametrizedAction - pa, SingleChoiceAction - sca, PopupWindowShow - pwsa).
- Поле Id в Action должно соответствовать полю Name с добавлением Id.
- Логика не должна содержаться в контроллере. Для этого необходимо использовать отдельные классы бизнес-логики, находящиеся в проекте DevPark.Cloud.CC.Module в папке BuisnesLogics.
</note>
Правила поддержки проекта
<note warning>
- Не допускается заливать в SVN код, содержащий предупреждения и ошибки.
- Не допускается заливать в SVN код, не прошедший все тесты из тестового проекта.
- Обязательно добавление тестов после добавления новых бизнес-объектов, контроллеров, функционала.
- Не допускается заливать в SVN код c предупреждениями StyleCop.
- Обязательно указание задач в Jira при заливке кода в SVN.
</note>
Правила кодирования
<note important>
- Все поля, классы и методы необходимо комментировать.
- Имена классов, полей, методов и.т.д. должны максимально отражать их сущность.
- Строки Xaf-сообщений должны добавляться и локализовываться в соответствии с http://documentation.devexpress.com/#Xaf/CustomDocument2655
- Все остальные строки должны добавляться через ресурсы приложения
<note warning>
- Запрещено использовать метод Save()!
- Запрещено использовать ObjectSpace.CommitChanges() в контроллерах!
- Запрещено использовать обработчик OnSaved()!
</note> </note>
Правила логирования
<note important>
- Для поддержки логирования используется библиотека NLog. Для логирования следует вызывать метод статического поля CurrentLogger класса Logger сборки DevPark.Clouds.CC.Module.
- Каждый метод должен содержать логирование входа в метод (с указанием названия метода и передаваемых параметров) и выхода из метода (с указанием названия метода и возвращаемого значения). Уровень логирования Debug.
- Каждый обработчик исключения также должен содержать логирование ошибки (с названием метода, в котором произошла ошибка и сообщения об ошибке). Уровень логирования Error.
</note>
Регламент поддержки тестирования
Инструменты тестирования
- Для тестирования используется NUnit и EasyTest.
- Для проверки Xaf-функционала в проект добавлен механизм использования Easy Test из Unit-тестов.
- Для вызова команд EasyTest используется класс TestCommandAdapter. Для его поддержки необходимо, чтобы класс с набором тестов наследовал класс WebTest.
Настройка модуля тестирования
Необходимо указать путь к папке с Web-приложением в файле TestApplcationTests.cs.
public class WebTestApplicationHelper : WebEasyTestFixtureHelperBase
{
public WebTestApplicationHelper() : base(@"..\..\..\DevPark.Cloud.CC.Web", @"D:\Work\DevPark.Clouds\DevPark.Cloud.CC.Web") { }
}
Описание команд адаптера Easy Test
- DoAction(“Название действия”, “Параметр”) - вызов action. Эмитирует нажатие на кнопку. Например кнопку “New”. В параметре “Название действия” необходимо указывать именно то название, которое отображается на форме. Может использоваться также для выполнения действий добавленных разработчиком. “Параметр” используется при выполнении действия Navigation. В нем указывается название пункта навигации к которому надо перейти.
- SelectRecords(“Название таблицы”, “Коллекция названий столбцов, по которым надо сделать выборку”, “Коллекция значений столбцов, по которым надо сделать выборку”) - выбор записей в таблице.
- SetFieldValue(“Название поля”, “Значение”) - проставить значение в поле формы.
- ProcessRecords(“Название таблицы”, “Коллекция названий столбцов, по которым надо сделать выборку”, “Коллекция значений столбцов, по которым надо сделать выборку”, “Название действия”) - обработка (открытие детальной формы) записи в таблице. В качестве Действия можно указать например Edit и открыть форму в режиме редактирования.
- ValidatationResult(“Строки сообщения об ошибке”) - проверка отработки валидации. Проверяем, что показано сообщение об ошибке.
- GetFieldValue(“Название поля”) - получить значение поля в детальной форме
- GetCellValue(“Название таблицы”, “Индекс строки”, “Заголовок столбца”) - получить значение ячейки в строке таблицы.
Правила поддержки тестирования
<note important>
- После добавления каждого нового бизнес-объекта необходимо реализовывать для него набор тестов.
- Файлы с описанием классов тестов бизнес-объектов находятся в проекте DevPark.Cloud.Tests в папке ObjectTests.
- Для каждого бизнес-объекта должен существовать свой класс тестов. Название класса формируется из названия объекта + Test. Каждый такой класс должен реализовывать интерфейс IObjectCommonTests, содержащий набор обязательных тестов.
- Если в объекте применяются правила валидации для каждого из них должен существовать свой тест.
- Для любого тестового класса необходимо указывать атрибуты [TestFixture, RequiresSTA].
- Все тестовые классы должны наследоваться от класса WebTests.
- Для каждого контроллера необходимо создавать свой класс с набором тестов. Файлы с описанием классов для тестирования контроллеров находятся в DevPark.Cloud.Tests в папке ControllerTests.
- Название класса для тестирования контроллера формируется следующим образом: Название объекта + VC + Test. Например: ClientVCTests.
- Для каждого Action в контроллере необходимо реализовывать набор тестов, проверяющих его функциональность.
- Классы, содержащие тесты предназначенные для проверки бизнес-логики для объекта находятся в проекте DevPark.Cloud.Tests в папке BuisnessLogicsTest.
- Название класса для тестирования бизнес-логики объекта формируется из названия объекта + BL + Test.
</note>
Процесс разработки
Добавление нового бизнес-объекта
- Объекты добавляются согласно правилам описанным в пункте Правила добавления бизнес-объектов.
- После добавления нового объекта необходимо добавить класс для его тестирования.
- Необходимо исправить все предупреждения StyleCop.
- Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
- Залить код в СВН с указанием задач в Jira.
Добавление нового контроллера
- Контроллеры добавляются согласно пункту Правила добавления контроллеров.
- После добавления контроллера необходимо добавить класс для его тестирования.
- Необходимо исправить все предупреждения StyleCop.
- Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
- Залить код в СВН с указанием задач в Jira.
Исправление ошибок и доработка функционала
- Для каждого нового функционала необходимо добавить тесты проверяющие его.
- Необходимо исправить все предупреждения StyleCop.
- Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
- Залить код в СВН с указанием задач в Jira.
Ссылки на ресурсы
<note tip>
- Разработка веб-службы:
http://dev.net.ua/blogs/evgeniymuzika/archive/2011/03/07/10665.aspx - Как писать EasyTest в коде:
http://community.devexpress.com/blogs/eaf/archive/2011/05/04/how-to-write-easytests-in-code.aspx
</note>
