Для полного понимания изложенного ниже материала рекомендуется ознакомиться с содержанием статьи Создание пустого модуля
Итак, начнем.
Службы — это компоненты, которые инкапсулируют связанную не UI функциональность, такую как журналирование, управление исключением, и доступ к данным. Службы часто регистрируются в контейнере внедрения зависимости так, чтобы они могли быть обнаружены или созданы при надобности и использоваться другими компонентами, которые зависят от них. В качестве примера можно рассмотреть службу IUsersService из статьи Создание пустого модуля.
Службы, предоставляемые модулем, рекомендуется регистрировать в едином месте, а именно в классе, наследующим класс ModuleBase. При необходимости зарегестрировать службы, в модуле должна быть перегружена функция RegisterServices().
Например, для регистрации службы, позволяющей оперировать местами хранения на складе, код будет выглядеть следующим образом:
protected override void RegisterServices()
{
base.RegisterServices();
UnityContainer.RegisterInstance<IStoragePlaceService>(
new StoragePlaceService(),
new ContainerControlledLifetimeManager());
}
Как видно из примера, мы регистрируем единственную службу (а точнее – единственный экземпляр службы) StoragePlaceService, которая реализует интерфейс IStoragePlaceService. После этого, указанную службу можно будет использовать в любом месте своей программы.
О том, как регистрировать службы и использовать контейнер, можно подробно почитать в руководстве к библиотеке PRISM (полный перевод руководства на русский доступен на ресурсе habrahabr.ru).
Теперь разберемся с тем, как добавлять элементы в главное меню приложения.
Рассмотрим следующий сценарий: у нас имеется представление, позволяющее редактировать места хранения на складе и мы хотим, чтобы к ней был доступ из главного меню нашего приложения.
Для этих целей в нашей оболочке предусмотрена служба главного меню: IMainMenuService (доступ к ней можно получить используя свойство MainMenuService базового класса ModuleBase). Для добавления элементов главного меню следует перегрузить функцию RegisterMenuItems() базового класса ModuleBase и поместить туда следующий код (для примера):
protected override void RegisterMenuItems()
{
base.RegisterMenuItems();
var icons = new ResourceDictionary { Source = new Uri("/ModernStore.DirectoriesModule;component/Resources/Images.xaml", UriKind.RelativeOrAbsolute) };
MainMenuService.Add(new MainMenuElement
{
Title = "Места хранения",
GroupName = DirGroupName,
IconData = icons[IconNames.StoragePlaceIcon] as Geometry,
Command = new RelayCommand(() => DocumentManager.NavigateTo<StoragePlacePresenter>())
});
}
Первым шагом мы получаем справочник с иконками, которые используются в нашем модуле (переменная icons). Для примера можно использовать следующий справочник:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resources="clr-namespace:ModernStore.DirectoriesModule.Resources">
<PathGeometry x:Key="{x:Static resources:IconNames.StoragePlaceIcon}">F1 M 23,19L 53,19L 56.9999,25.0001L 57,27L 19,27L 19,25.0001L 23,19 Z M 19,42L 19,29L 57,29L 57,42L 19,42 Z M 34,33L 34,35L 42,35L 42,33L 34,33 Z M 19,57L 19,44L 56.9999,44L 57,57L 19,57 Z M 34,48L 34,50L 42,50L 42,48L 34,48 Z</PathGeometry>
</ResourceDictionary>