======Руководство разработчика======
=====Пространства имен=====
Все пространства имен образуются путем добавления к общей части названия **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** - папка для файлов классов содержащих бизнес-логику.
=====Правила разработки=====
====Правила настройки интерфейса====
-Настройка интерфейса должна осуществляться через атрибуты. Необходимо использовать Model.DesignedDiffs.xafml в проекте DevPark.Cloud.CC.Module.Web.
====Атрибуты настройки====
\\ Атрибуты класса:
\\ **[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
====Правила добавления бизнес-объектов====
-Бизнес-объекты приложения для управления пользователями (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).
====Правила добавления контроллеров====
-Для одной сущности должен существовать только один контроллер.
-Контроллеры по возможности необходимо добавлять в проект 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.
====Правила поддержки проекта====
-Не допускается заливать в SVN код, содержащий предупреждения и ошибки.
-Не допускается заливать в SVN код, не прошедший все тесты из тестового проекта.
-Обязательно добавление тестов после добавления новых бизнес-объектов, контроллеров, функционала.
-Не допускается заливать в SVN код c предупреждениями StyleCop.
-Обязательно указание задач в Jira при заливке кода в SVN.
====Правила кодирования====
-Все поля, классы и методы необходимо комментировать.
-Имена классов, полей, методов и.т.д. должны максимально отражать их сущность.
-Строки Xaf-сообщений должны добавляться и локализовываться в соответствии с http://documentation.devexpress.com/#Xaf/CustomDocument2655
-Все остальные строки должны добавляться через ресурсы приложения
-Запрещено использовать метод Save()!
-Запрещено использовать ObjectSpace.CommitChanges() в контроллерах!
-Запрещено использовать обработчик OnSaved()!
====Правила логирования====
-Для поддержки логирования используется библиотека NLog. Для логирования следует вызывать метод статического поля CurrentLogger класса Logger сборки DevPark.Clouds.CC.Module.
-Каждый метод должен содержать логирование входа в метод (с указанием названия метода и передаваемых параметров) и выхода из метода (с указанием названия метода и возвращаемого значения). Уровень логирования Debug.
-Каждый обработчик исключения также должен содержать логирование ошибки (с названием метода, в котором произошла ошибка и сообщения об ошибке). Уровень логирования Error.
=====Регламент поддержки тестирования=====
====Инструменты тестирования====
-Для тестирования используется 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("Название таблицы", "Индекс строки", "Заголовок столбца")** - получить значение ячейки в строке таблицы.
====Правила поддержки тестирования====
-После добавления каждого нового бизнес-объекта необходимо реализовывать для него набор тестов.
-Файлы с описанием классов тестов бизнес-объектов находятся в проекте DevPark.Cloud.Tests в папке ObjectTests.
-Для каждого бизнес-объекта должен существовать свой класс тестов. Название класса формируется из названия объекта + Test. Каждый такой класс должен реализовывать интерфейс IObjectCommonTests, содержащий набор обязательных тестов.
-Если в объекте применяются правила валидации для каждого из них должен существовать свой тест.
-Для любого тестового класса необходимо указывать атрибуты [TestFixture, RequiresSTA].
-Все тестовые классы должны наследоваться от класса WebTests.
-Для каждого контроллера необходимо создавать свой класс с набором тестов. Файлы с описанием классов для тестирования контроллеров находятся в DevPark.Cloud.Tests в папке ControllerTests.
-Название класса для тестирования контроллера формируется следующим образом: Название объекта + VC + Test. Например: ClientVCTests.
-Для каждого Action в контроллере необходимо реализовывать набор тестов, проверяющих его функциональность.
-Классы, содержащие тесты предназначенные для проверки бизнес-логики для объекта находятся в проекте DevPark.Cloud.Tests в папке BuisnessLogicsTest.
-Название класса для тестирования бизнес-логики объекта формируется из названия объекта + BL + Test.
[[devpark:dev:test_list|Список тестов]]
=====Процесс разработки=====
====Добавление нового бизнес-объекта====
-Объекты добавляются согласно правилам описанным в пункте **Правила добавления бизнес-объектов**.
-После добавления нового объекта необходимо добавить класс для его тестирования.
-Необходимо исправить все предупреждения StyleCop.
-Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
-Залить код в СВН с указанием задач в Jira.
====Добавление нового контроллера=====
-Контроллеры добавляются согласно пункту **Правила добавления контроллеров**.
-После добавления контроллера необходимо добавить класс для его тестирования.
-Необходимо исправить все предупреждения StyleCop.
-Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
-Залить код в СВН с указанием задач в Jira.
====Исправление ошибок и доработка функционала====
-Для каждого нового функционала необходимо добавить тесты проверяющие его.
-Необходимо исправить все предупреждения StyleCop.
-Провести комплексное тестирование. Если будут обнаружены ошибки - исправить их.
-Залить код в СВН с указанием задач в Jira.
=====Ссылки на ресурсы=====
-Разработка веб-службы: \\ http://dev.net.ua/blogs/evgeniymuzika/archive/2011/03/07/10665.aspx
-Разработка виджетов: \\ http://www.codeproject.com/Articles/38701/Developing-Widgets-with-ASP-NET-WCF-and-jQuery
-NUnit: \\ http://sourceforge.net/projects/nunit/?source=dlp
-Как писать EasyTest в коде: \\ http://community.devexpress.com/blogs/eaf/archive/2011/05/04/how-to-write-easytests-in-code.aspx