======Руководство разработчика====== =====Пространства имен===== Все пространства имен образуются путем добавления к общей части названия **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