Быстрый старт с Xafari Оглавление Введение ...................................................................................................................................................................... 3 Что необходимо для разработки ............................................................................................................................... 4 Постановка задачи ...................................................................................................................................................... 5 Создание приложения ................................................................................................................................................ 6 Разработка бизнес-модели приложения .................................................................................................................. 8 Панель модулей Xafari .............................................................................................................................................. 12 Добавление и настройка системы безопасности ................................................................................................... 13 Добавление и настройка АРМов.............................................................................................................................. 18 Значения по умолчанию ........................................................................................................................................... 23 Нумераторы ............................................................................................................................................................... 24 Фильтр по дате .......................................................................................................................................................... 25 TabbedDetailPropertyEditor ....................................................................................................................................... 26 Подключение плавающих панелей ......................................................................................................................... 27 Категории ................................................................................................................................................................... 28 Групповое редактирование ...................................................................................................................................... 29 Введение В этом руководстве Вам предлагается использовать Xafari framework для разработки простого проекта по управлению спортивным турниром для Windows и Web. Следуя пошаговым инструкциям, описанным ниже, Вы познакомитесь c различными возможностями, предоставляемыми платформой для разработки бизнес-приложений. Разработка бизнес-модели производится с использованием модуля Xafari.BC.CD=>о подключении панели модулей Xafari надо писать сразу после создания приложения, а в описании бизнес-модели уже использовать Что необходимо для разработки Для того чтобы приступить к разработке проекта Вам понадобится: Microsoft Visual Studio 2010 Microsoft SQL Server DXperience-12.2.4 Xafari.Framework-12.2.4 Постановка задачи Турнир содержит перечень разделов (Section) в которых соревнуются участники (Member). Участником турнира может быть спортсмен (Sportsmen), заявленный от спортивной организации (Organisation) для участия в одном или нескольких разделах. Организаторы турнира должны обеспечить регистрацию участников, подготовку документов для проведения соревнований в разделах, собственно проведение соревнований, награждение победителей и выписку итоговой документации. Эти задачи будут конкретизированы и решены в нижеследующих главах руководства. Диаграмма бизнес-классов: Создание приложения В Microsoft Visual Studio создайте кросс-платформенное XAF-приложение и настройте строку подключения Web- и Win-версий для работы с локальной БД Microsoft SQL Server: cоздание приложения: настройка строки подключения (выполняется отдельно для Win- и Web-приложений): Можете запустить приложение. Разработка бизнес-модели приложения Для разработки бизнес-модели приложения будут использованы доменные компоненты XAF. Бизнес-классы Organisation, Sportsmen и Trainer будут разрабатываться с применением наследования от доменных компонентов Company и Person, поставляемых в библиотеке бизнес-классов Xafari.BC.DC. Список бизнес-классов: Свойство Тип Section (раздел проводимого турнира) Name String Time Double Order String Organisation (справочник со сведениями об организациях) Name String Country String Region String City String Adress1 String Adress2 String Post Zip String Trainer (справочник со сведениями о тренерах) FirstName String LastName String MiddleName String Organisation String Skill (справочник с перечнем спортивных квалификаций) Name String Sportsmen (справочник со сведениями о спортсменах) FirstName String LastName String MiddleName String Birthday DateTime Age Int Photo Image Organisation String Trainer String Skill String Member (участник турнира) Sportsmen String Section String Result Int DateReg DateTime Примечания Название раздела Кол-во минут, отводимое на соревнований в данном разделе Порядок следования разделов проведение Название организации Эти свойства описаны Company.Xafari.BC.CD в интерфейсе Эти свойства описаны Person.Xafari.BC.CD в интерфейсе Организация, в которой он работает Название Эти свойства описаны Person.Xafari.BC.CD в интерфейсе Дата рождения Возраст Фото Организация, в которой он тренируется Тренер, который его тренирует Спортивная квалификация Спортсмен, заявленный к участию Раздел, в который его заявили Занятое место (после проведения соревнований в разделе) Дата подачи заявки Для разработки бизнес-модели приложения выполните следующие действия: создайте описанный в таблице перечень доменных компонентов в папке BusinesObjects платформенно-независимого модуля: Organisation является потомком Company, Trainer и Sportsmen являются потомками Person: using Xafari.BC.CD; ... public interface Organization:Company ... public interface Trainer:Person ... опишите свойства бизнес-классов в соответствии с таблицей, реализуйте отношения между бизнесклассами: Section [DomainComponent] [ImageName("BO_Section")] [DeferredDeletion(false)] public interface Section { string Name { get; set; } Double Time { get; set; } string Order { set; get; } IList<Member> Members { get; } } Organisation [DomainComponent] [DeferredDeletion(false)] [ImageName("BO_Organization ")] public interface Organization:Company { IList<Trainer> Trainers { get; } IList<Sportsmen> Athletes { get; } } Trainer [DomainComponent] [DeferredDeletion(false)] [ImageName("BO_Person")] public interface Trainer:Person { Organization Organization { get; set; } IList<Sportsmen> Athletes { get; } } Skill Sportsmen [DomainComponent] [DeferredDeletion(false)] [XafDefaultProperty("FullName")] public interface Sportsmen : Person { DateTime Birthday { get; set; } int Age { get; } [ValueConverter(typeof(ImageValueConverter))] [Delayed] [VisibleInListView(false)] Image Photo { get; set; } Organization Organisation { get; set; } Skill Skill { get; set; } Trainer Trainer { get; set; } } Для вычисления полного возраста по дате рождения примените Domain Logic [DomainLogic(typeof(Sportsmen))] public class SportsmenLogic { public static int Get_Age(Sportsmen instance) { int todayDay = DateTime.Today.Day; int birthdayDay = instance.Birthday.Day; int todayMonth = DateTime.Today.Month; int birthdayMonth = instance.Birthday.Month; if (todayMonth == birthdayMonth && todayDay >= birthdayDay) return DateTime.Today.Year - instance.Birthday.Year; if (todayMonth > birthdayMonth) return DateTime.Today.Year - instance.Birthday.Year; return DateTime.Today.Year - instance.Birthday.Year - 1; } } Member [DomainComponent] [ImageName("BO_Person")] [DeferredDeletion(false)] public interface Member { Sportsmen Sportsmen { get; set; } Section Section { get; set; } Double Result{get;set;} DateTime DateReg { get; set; } } зарегистрируйте созданные доменные компоненты в Module.cs: ... using Xafari.BC; using Sport_Tournament_Management.Module.BusinessObjects; using Xafari.BC.CD; ... public override void Setup(XafApplication application) { XafariBCModule.RegisterDC(); XafTypesInfo.Instance.RegisterEntity("Sportsmen", typeof(Sportsmen)); XafTypesInfo.Instance.RegisterEntity("Trainer", typeof(Trainer)); XafTypesInfo.Instance.RegisterSharedPart(typeof(Person)); XafTypesInfo.Instance.RegisterEntity("Organization", typeof(Organization)); XafTypesInfo.Instance.RegisterEntity<AddressInfo>(); XafTypesInfo.Instance.RegisterEntity<Country>(); XafTypesInfo.Instance.RegisterEntity<Region>(); XafTypesInfo.Instance.RegisterEntity<City>(); XafTypesInfo.Instance.RegisterEntity("Skill", typeof(Skill)); XafTypesInfo.Instance.RegisterEntity("Section", typeof(Section)); XafTypesInfo.Instance.RegisterEntity("Member", typeof(Member)); } Панель модулей Xafari Для удобства дальнейшей работы зарегистрируйте модули платформы Xafari на Toolbox Visual Studio: Теперь для добавления какого-либо из модулей Xafari Вы сможете воспользоваться Application Designer или Module Designer. Добавление и настройка системы безопасности При проведении спортивного турнира необходимо определить уровень доступа к приложению для следующих пользователей: главный секретарь (Administrator) – обладает всеми правами, имеет полный доступ ко всем объектам и операциям, может раздавать права другим пользователям регистратор участников (Registrator) – помощник (или несколько) главного секретаря, который может вносить сведения о спортсменах, тренерах, организациях, участниках, но он не должен иметь права удалять организации и вносить изменения в список разделов (список разделов правит только главный секретарь). главный судья (ChiefJudge) – для принятия оперативных решений должен обладать возможностью просмотра двух списков: зарегистрированных участников и разделов турнира, не может редактировать никакие данные. Система безопасности платформы Xafari позволяет организовать доступ пользователей к системе на основании ролей. Каждая роль характеризуется набором разрешений. Администратор имеет полный набор разрешений, может создавать роли (задавать разрешения для них), а затем назначать роли пользователям. Применим эту систему к разрабатываемому приложению. Роль может быть описана в модели приложения для использования в некоторых настройках, в этом случае необходимо установить требование синхронизации ролей в БД и в модели приложения. Создадим роли пользователей в модели и настроим для них систему безопасности. Для этого выполните следующие действия: добавьте модуль XafariSecurityModule в платформонезависимый модуль Module.cs: добавьте модуль XafariSecurityWinModule в модуль Win-приложения WinModule.cs (аналогично добавьте XafariSecurityWebModule в WebModule.cs) добавьте в секцию Security Win-приложения модули SecurityStrategyComplex (панель DX.12.2:XAF Security) и XafariAutentication (аналогично поступите для Web-приложения) для компонента SecurityStrategyComplex установите свойству RoleType значение Xafari.Security.Strategy.XafariSecuritySystemRole: запустите редактор модели и в узел Xafari|Roles добавьте роли Registrator и ChiefJudge для синхронизации ролей в модели приложения с базой данных для системы безопасности в конструктор класса приложения добавьте код (отдельно для Win и Web приложений): public Sport_Tournament_ManagementWindowsFormsApplication() { ... XafariSecuritySystem.SinchronizeWithModel=true; } запустите приложение: в приложении перейдите к списковой форме Роли сформируйте набор разрешений для ролей, создайте пользователей с этими ролями: Добавление и настройка АРМов Требуется обеспечить для пользователей приложения удобный и быстрый доступ к выполнению операций в соответствии с их ролями: Registrator нуждается в непосредственном доступе к спискам участников, организаций и спортсменов с которыми далее он будет работать в соответствии со своим набором разрешений. ChiefJudge, в свою очередь, нуждается в доступе к спискам участников и разделов турнира. При разработке приложения на платформе Xafari такая задача быстро решается с помощью АРМов, которые обеспечивают доступ пользователя к выполнению различных операций в соответствии с его ролью. Подключим АРМы к приложению и настроим в редакторе модели. Подключение АРМов к Win-приложению Для использования АРМов в Win-приложении выполните следующие действия: добавьте модуль XafariArmsModule в платформонезависимый модуль Module.cs: добавьте модуль XafariArmsWinModule в Win-приложение: в платформонезависимом модуле создайте папку Model и добавьте в нее интерфейс: public interface IModelSport_Tournament_Management { [DefaultValue(true)] [Category("Appearance")] bool EnableARMs { get; set; } } В платформонезависимом модуле добавьте контроллер: public partial class EnableARMsViewController : ViewController, IModelExtender { public EnableARMsViewController() { InitializeComponent(); RegisterActions(components); } #region IModelExtender Members void IModelExtender.ExtendModelInterfaces(ModelInterfaceExtenders extenders) { extenders.Add<IModelArmDesign, IModelSport_Tournament_Management>(); } #endregion } в WinApplication объявите событие CreateCustomTemplate и реализуйте обработчик: WinApplication.Designer.cs: this.CreateCustomTemplate+= new System.EventHandler<DevExpress.ExpressApp.CreateCustomTemplateEventArgs>(Sport_Tournament_Management WindowsFormsApplication_CreateCustomTemplate); WinApplication.cs: private void Sport_Tournament_ManagementWindowsFormsApplication_CreateCustomTemplate(object sender, CreateCustomTemplateEventArgs e) { if (e.Context == TemplateContext.ApplicationWindow) { if (((IModelSport_Tournament_Management)((IModelXafariArms)((IModelApplicationXafari)this.Model).Xafari).ArmDesign).Enabl eARMs) e.Template = new ArmsMainForm(); else e.Template = null; } else if (e.Context == TemplateContext.View) e.Template = new DetailViewForm(); } приложение запустится с АРМом вместо NavigationItem: Подключение АРМов к Web-приложению добавьте модуль XafariArmsWebModule в Web-приложение добавьте в папку проекта web-приложения новый DXperience шаблон XafariDefaultTemplateContent: замените код файла XafariDefaultTemplateContent.acsx следующим: code (и перестройте проект) в файле Default.aspx.cs в классе Default реализуйте метод SetArmsCaption интерфейса ISupportArms: ... public partial class Default : BaseXafPage, ISupportArms { ... public void SetArmsCaption(string caption) { } } в файле Global.asax.cs в конец метода Session_Start(Object sender, EventArgs e) добавьте следующий код: protected void Session_Start(Object sender, EventArgs e) { ... WebApplication.Instance.Settings.DefaultTemplateContentPath = "~/XafariDefaultTemplateContent.ascx"; WebWindowTemplateHttpHandler.PreferredApplicationWindowTemplateType = TemplateType.Horizontal; } приложение запустится с АРМом вместо NavigationItem Настройка АРМов в редакторе модели осуществите настройку АРМов: Значения по умолчанию Необходимо настроить карточную форму Sportsmen_DetailView таким образом, чтобы в поле Title по умолчанию стояло значение «Уважаемый господин», а в поле Organisation по умолчанию предлагалась бы организация предыдущего сохраненного спортсмена. Предлагается использовать значения по умолчанию Xafari. Для того чтобы задать значение по умолчанию для свойства Title, выполните следующие действия: добавьте модуль XafariModule в платформонезависимый модуль (Module.cs) в редакторе модели настройте узел Sportsmen_DetailView|Items|Title: Для свойства Organisation настройте в качестве значения по умолчанию название организации из последнего сохраненного объекта Sportsmen. Нумераторы При формировании списка разделов (Section) поле Order заполняется порядковыми номерами, которые определяют порядок следования разделов в списке. Заполнение данного поля можно автоматизировать с помощью сервиса нумераторов платформы Xafari. Для того чтобы установить автоматическое заполнение поля Order с помощью порядковых номеров выполните следующие действия: добавьте модули XafariModule , XafariBCNumeratorsModule, XafariBCNumeratorsXPOModule в платформонезависимый модуль (Module.cs) перегрузите метод Setup(XafApplication application), добавив PersistenceProviders: public override void Setup(XafApplication application) { NumeratorManager.Instance.PersistenceProvider = new DCNumeratorPersistenceProvider(); NumeratorManager.Instance.PersistenceProvider = new XPNumeratorPersistenceProvider(); ... } в редакторе модели добавьте нумератор SectionOrder в узел Xafari|Numerators: привяжите созданный нумератор к свойству бизнес-класса: Фильтр по дате При просмотре списка участников турнира главному судье необходима возможность фильтровать список по дате подачи заявки. Подключим к приложению фильтр по дате. Для этого выполните следующие действия: добавьте модули XafariModule, XafariFiltersModule в платформонезависимый модуль (Module.cs) добавьте модуль XafariFiltersWindowsModule в Win-приложение (WinApplication.cs) в редакторе модели настройте Member_ListView: Замечание: в Xafari.12.2 возможность поддержки фильтра по дате для Web – приложений не реализована TabbedDetailPropertyEditor Возможна ситуация, когда непосредственно перед началом турнира регистрируется большое количество новых спортсменов. Ввод всех данных может повлечь задержку начала соревнований. Для ускорения процедуры ввода данных сведения о спортсмене можно разделить на основные и остальные: Основные сведения – информация, без которой Остальные сведения – информация для итогового невозможно подготовить списки участников в отчета, наградной грамоты, статистики и др., все это разделах можно ввести во вторую очередь (ночью, например) FirstName MiddleName LastName Birthday Organisation Age Photo Trainer Skill Необходимо разбить карточную форму Sportsmen_DetailView на 2 закладки: «Основные сведения» и «Остальные сведения». Предлагается использовать TabbedDetailPropertyEditor Xafari. Для этого выполните следующие действия: добавьте модуль XafariEditorsModule в платформонезависимый модуль (Module.cs) добавьте модуль XafariEditorsWinModule в Win-приложение (WinApplication.cs) для доменного компонента Sportsmen определите поле ThisObject: public interface Sportsmen : Person { ... [VisibleInDetailView(false),VisibleInListView(false)] Sportsmen ThisObject { get; } } в редакторе модели свойству ThisObject бизнес-класса Sportsmen назначьте тип редактора Xafari.Editors.Win.WinTabbedDetailPropertyEditor: Обратите внимания, что модель настраивается в проекте приложения! в редакторе модели настройте Sportsmen_DetailView по аналогии с примером Подключение плавающих панелей Функциональность плавающих панелей будет востребована далее при решении ряда задач. Для подключения плавающих панелей выполните следующие действия: добавьте модули XafariModule, XafariDockPanelsModule в платформонезависимый (Module.cs) добавьте модуль XafariDockPanelsWinModule в Win-приложение (WinApplication.cs) модуль Категории При просмотре списка участников турнира (Member_ListView) необходимо обеспечить возможность быстрого выбора и просмотра следующих подгрупп: все участники в заданном разделе все участники от заданной организации Предлагается использовать категории Xafari. Для подключения и настройки категорий выполните следующие действия: подключите к приложению функциональность плавающих панелей добавьте модуль XafariBCModule в платформонезависимый модуль (Module.cs) добавьте модуль XafariBCWinModule в Win-приложение (WinApplication.cs) в редакторе модели настройте узел Categories в бизнес-классе Member: Групповое редактирование Возможна ситуация, когда в два смежных раздела зарегистрировалось малое количество участников и главный судья может принять решение объединить разделы: Выполнить такую операцию предлагается с использованием группового редактирвания. Для подключения и настройки группового редактирования выполните следующие действия: подключите к приложению функциональность плавающих панелей добавьте модули XafariBCModule, XafariEditorsModule в платформонезависимый модуль (Module.cs) добавьте модуль XafariBCWinModule, XafariEditorsWinModule в Win-приложение (WinApplication.cs) в редакторе модели настройте Member_ListView: