Непосредственное создание файла пакета управления для управления проекторами

 

Опубликовано: Июль 2016

Применимо к: System Center 2012 SP1 - Service Manager, System Center 2012 R2 Service Manager, System Center 2012 - Service Manager

Пакеты управления используются для направления и расширения функций System Center 2012 – Service Manager. В данной статье используются проекторы для описания различных разделов пакета управления, а также создания различных объектов, необходимых для управления проекторами в рамках организации.

В статье приводится полноценный образец пакета управления с необходимыми расширениями для управления проекторами организации. Также в ней описывается процесс импорта пакета управления с помощью командлета Windows PowerShell

В этой статье описываются следующие разделы пакета управления:

  • Manifest

  • TypeDefinitions (определения типов) для создания перечислений классов и отношений между классами

  • Формы

В этой статье также описываются разделы пакета управления, в которых содержатся декларации и определения пользовательского интерфейса и элементов локализации, а именно, следующие разделы:

  • Категории

  • Presentation

  • Расширения классов

Раздел Manifest

Первый раздел пакета управления содержит манифест. Манифест идентифицирует пакет управления и объявляет все ссылки на другие пакеты управления.

В примере ниже показан раздел Manifest из пакета управления, созданного для слежения за корпоративными проекторами.

  
<Manifest>  
  <Identity>  
    <ID>ServiceManager.Projector_Authoring</ID>  
    <Version>7.0.3707.0</Version>  
  </Identity>  
  <Name>Projector Library</Name>  
  <References>  
    <Reference Alias="System">  
      <ID>System.Library</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="SMConsole">  
      <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="Authoring">  
      <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="SMConfig">  
      <ID>ServiceManager.ConfigurationManagement.Library</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
  </References>  
</Manifest>  
System_CAPS_ICON_important.jpg Важно


В разделе References в псевдонимах ссылок не используйте символы помимо букв и цифр (такие как ".").

Раздел TypeDefinitions — создание класса

В этом разделе пакета управления содержатся определения типов. Раздел TypeDefinitions содержит определения классов, перечислений и отношений, используемых пакетом управления.

В следующем примере представлен класс, содержащий сведения о проекторах:

  
<TypeDefinitions>  
    <EntityTypes>  
      <ClassTypes>  
        <ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">  
          <Property ID="SerialNumber" Type="int" Key="true" />  
          <Property ID="Make" Type="string" />  
          <Property ID="Model" Type="string"  />  
          <Property ID="Location" Type="string" />  
          <Property ID="Condition" Type="enum" EnumType="ProjectorCondition"  />  
        </ClassType>  
      </ClassTypes>  
      <RelationshipTypes>  
      </RelationshipTypes>  
      <EnumerationTypes>  
        <EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>  
      </EnumerationTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
  

Ниже представлено поэтапное описание содержимого раздела определения типов.

Раздел ClassTypes

Элемент ClassType определяет класс проектора:

<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">

Атрибут ID является уникальным идентификатором данного класса. Ему присвоено следующее значение:

ID="System.ConfigItem.Projector"

Атрибут Base является идентификатором класса, из которого происходит данный класс. Поскольку проектор в каком-то роде является элементом конфигурации, этот атрибут имеет следующее значение:

Base="System!System.ConfigItem"

Приставка System! обозначает, что данный класс (System.ConfigItem) находится в пакете управления, ссылка на который осуществляется при помощи псевдонима System.

Атрибут Hosted определяет, размещен ли данный класс в другом классе. Если это так, экземпляр данного класса может существовать только при условии, что существует родительский экземпляр. В данном примере проекторы не размещены внутри какого-либо класса, поэтому атрибут Hosted имеет значение false.

Hosted="false"

Если атрибут Hosted имеет значение true, это означает, что класс размещен в другом классе. Отношение размещения должно быть объявлено в разделе RelationshipTypes.

Атрибут Accessibility определяет, могут ли другие классы использовать данный класс в качестве базового. Чтобы позволить другим создавать специализированные версии класса, установите этому атрибуту значение public, например, следующим образом:

Accessibility="Public"

Установка атрибуту Accessibility значения Internal предотвращает создание классов на основе данного класса.

Атрибут Abstract определяет, можно ли создавать экземпляры данного класса, или же класс используется лишь в качестве родительского класса для других классов. В данном примере этот атрибут имеет значение false. Установка для атрибута значения true приводит к невозможности непосредственного создания экземпляров этого класса, позволяя использовать его лишь в качестве родительского класса.

В следующем разделе определения класса находятся свойства класса. XML-код, определяющий свойства класса в данном примере, приведен ниже.

  
<Property ID="SerialNumber" Type="int" Key="true" />  
<Property ID="Make" Type="string" />  
<Property ID="Model" Type="string"  />  
<Property ID="Location" Type="string" />  
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition"  />  
  

Каждый элемент Property имеет следующие атрибуты:

  • Атрибут ID представляет собой уникальный идентификатор свойства.

  • Атрибут Type, обозначает тип данных свойства.

  • Атрибут Key. Установка данному атрибуту значения true обозначает, что это свойство будет использоваться в качестве уникального идентификатора данного класса.

Создание типов перечислений

Перечисления типа enum являются специальными типами данных. Перечисления используются для ограничения возможных значений свойства заранее определенным набором. Перечисления могут быть иерархическими, одно перечисление может основываться на другом.

Перечисления создаются в разделе пакета решения EnumertionTypes. Определение перечисления содержит корневое перечисление, за которым следуют фактические значения перечисления.

Каждый EnumerationValue принимает несколько атрибутов:

В данном примере перечисление определяется для отслеживания технического состояния проекторов. Ниже представлено определение данного перечисления.

  • ID является идентификатором перечисления или значения перечисления.

  • Accessibility указывает, может ли данный перечислитель содержать другие перечислители.

  • ParentName — это атрибут, указывающий значение ID для родительского элемента значения перечислителя.

  
<EnumerationTypes>  
   <EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>  
</EnumerationTypes>  
  

Создание формы

Формы Service Manager основаны на формах Windows Presentation Framework (WPF).Service Manager расширяет систему WPF с помощью простых атрибутов, добавляемых в определение XML и позволяющих Service Manager привязывать данные из пакета управления к форме.

Формы Service Manager можно создавать с помощью ряда средств, в том числе с помощью Microsoft Visual Studio и Microsoft Expression Blend. Поскольку формы основаны на XML, их также можно создавать с помощью любого редактора XML.

В примере ниже показано определение формы, созданное при помощи пакета Microsoft Expression Blend. В данной форме размещены четыре элемента управления, три текстовых поля и одно поле со списком. Все они привязаны к свойствам класса Проектор, которые были определены ранее.

  
<UserControl xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SMFormsDemo" x:Class="SMFormsDemo.TestControl" x:Name="Control" Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">  
   <UserControl.Resources>  
      <ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues"/>  
   </UserControl.Resources>  
   <Grid x:Name="LayoutRoot">  
      <Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>  
      <TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>  
      <Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>  
      <TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}"/>  
      <Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>  
      <TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>  
      <Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>  
      <TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}"/>  
      <Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>  
      <ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
         <ComboBox.SelectedItem>  
            <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
         </ComboBox.SelectedItem>  
         <ComboBox.ItemTemplate>  
            <DataTemplate>  
               <StackPanel>  
                  <TextBlock Text="{Binding Path=DisplayName}"/>  
               </StackPanel>  
            </DataTemplate>  
         </ComboBox.ItemTemplate>  
      </ComboBox>  
   </Grid>  
</UserControl>  
  

Чтобы активировать привязку элементов управления формой к свойствам класса, определенным в пакете управления, следует указать ряд элементов.

Привязка текстовых элементов управления

Для привязки текстовых полей к свойствам класса добавьте тег Binding Path к свойству Text в элементе текстового поля. Пример:

{Binding Path=SerialNumber, Mode=TwoWay}  

Данный тег привязывает элемент управления "Текстовое поле" к свойству SerialNumber класса Projector, определенного в пакете управления, и указывает, что привязка должна быть двусторонней. Значение этого свойства извлекается из базы данных и отображается в текстовом поле при загрузке формы. Если пользователь меняет его, новое значение свойства сохраняется в базе данных.

Привязка полей со списком

Чтобы форма могла извлечь данные перечисления из соответствующего пакета управления и привязать их к элементу управления формой, в разделе code-behind формы должен быть определен класс поддержки. Класс поддержки должен иметь метод, который возвращает перечисление, определенное в пакете управления. Для возврата перечисления используйте метод GetEnumerations, принадлежащий текущему пакету управления. Доступ к данному экземпляру выполняется при помощи класса ConsoleContextHelper из пакета средств разработки (SDK) для Service Manager. В приведенном ниже примере класс поддержки определяет метод GetStatusValues, извлекающий значения перечисления ProjectorCondition, которое было определено в пакете управления.

  
public class helper  
{  
   public static ICollection<IDataItem> GetStatusValues()  
   {  
      return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);  
   }  
}  
  

Чтобы получить доступ к данному методу, в находящемся в пакете управления определении формы следует определить ряд элементов.

Прежде всего в определение формы добавляется пространство имен, указывающее на пространство имен code behind для формы. В данном примере используется пространство имен SMFormsDemo.

xmlns:local="clr-namespace:SMFormsDemo"  

Далее следует определить объект ObjectDataProvider для передачи значений полю со списком, отображающему состояние проектора.ObjectDataProvider определяется в виде ресурса:

  
<UserControl.Resources>  
   <ObjectDataProvider   
      ObjectType="{x:Type local:helper}"    
      MethodName="GetStatusValues"   
      x:Key="getStatusValues" />  
</UserControl.Resources>  
  

Этот поставщик данных указывает объект и метод, используемые для получения значений перечисления из пакета управления.

И, наконец, чтобы привязать поле со списком к значениям перечисления, указанным в пакете управления, в определение поля со списком добавляется атрибут ItemsSource. Данный атрибут указывает, куда извлечь значения перечисления, например:

ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"  

Далее, в XAML-определение элемента управления "поле со списком" добавляются элементы SelectedItem и ItemTemplate. В следующем примере показывается определение поля со списком с дополнительным XAML-кодом привязки.

  
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
   <ComboBox.SelectedItem>  
      <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
   </ComboBox.SelectedItem>  
   <ComboBox.ItemTemplate>  
      <DataTemplate>  
         <StackPanel>  
            <TextBlock Text="{Binding Path=DisplayName}"/>  
         </StackPanel>  
      </DataTemplate>  
   </ComboBox.ItemTemplate>  
</ComboBox>  
  

Раздел Category

Раздел Category группирует элементы пакета управления для упрощения навигации.

Первые два элемента <Category> в данном примере используются для управления отображением задач Создать и Правка в представлении Проекторы.

<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />  
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />  

Вторые два элемента Category в данном образце пакета управления используются для отображения состояния проекторов в представлении Списки на панели Создание в Консоль Service Manager. Это позволяет пользователю выполнять настройку значений:

<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>  

Добавление данной категории в представленный ниже пример приводит к появлению задачи Правка в представлении Списки для значения EnumerationValue, на которое указывает атрибут Target.

<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>  

Раздел Presentation

Раздел Presentation используется для объявления и определения элементов, связанных с пользовательским интерфейсом. К этому разряду относятся объявления форм, категории и задачи консоли.

Раздел Forms

В разделе Forms объявляются формы, используемые пакетом управления. В примере ниже указывается расположение формы, определенной для отображения и изменения экземпляров класса Projector. Данный код привязывает форму к классу Projector, определенному в пакете управления.

  
<Forms>  
   <Form TypeName="SMFormsDemo.TestControl"  
      ID="TestForm"  
      Target="System.ConfigItem.Projector"  
      Assembly="ProjectorFormsAssembly"  
      Accessibility="Public">  
   <Category>Form</Category>  
   </Form>  
</Forms>  
  

В представленном выше примере используются следующие атрибуты:

  • Атрибут TypeName содержит пространство имен и имя класса для формы.

  • Атрибут ID содержит уникальный идентификатор данного экземпляра формы.

  • Атрибут Target содержит имя класса, к которому привязана данная форма.

  • Атрибут Assembly указывает на внешний ресурс, в котором размещена форма.

  • Атрибут Accessibility определяет возможность настройки данной формы.

Определение представления

Раздел пакета управления Views содержит определения представлений пользовательского интерфейса. Эти представления можно использовать для фильтрации и отображения объектов пакета управления.

<View Target="System.ConfigItem.Projector"   
Enabled="true"  
TypeID="SMConsole!GridViewType"  
ID="AllProjectorsView"  
Accessibility="Public">  
<Category>NotUsed</Category>  
<Data>  
<Adapters>  
      <Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">  
                <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
   <AdapterType>  
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter  
   </AdapterType>  
      </Adapter>  
            <Adapter AdapterName="viewframework://adapters/ListDefault">  
              <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>  
              <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>  
            </Adapter>  
</Adapters>  
<ItemsSource>  
  <AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000"  treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >  
    <AdvancedListSupportClass.Parameters>  
                <QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>  
    </AdvancedListSupportClass.Parameters>  
    </AdvancedListSupportClass>  
    </ItemsSource>  
    <Criteria />  
</Data>  
<Presentation>  
<Columns>  
            <mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">  
              <mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />  
              <mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />  
              <mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />  
              <mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />  
              <mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />  
            </mux:ColumnCollection>      
</Columns>  
</Presentation>  
</View>  
  

Атрибут View Target указывает на класс, который будет отображаться в представлении.

Пример выше содержит ссылку на пакет управления консоли Service Manager. Данный пакет управления содержит определение используемого типа представления. В этом экземпляре определен тип представления SMConsole!GridViewType.

Элемент AdvancedListSupportClass определяет ряд параметров, самым важным из которых является параметр TargetClass. Установите этому параметру значение ID из элемента ClassType, который будет показан в данном представлении. Для отображения столбцов, являющихся свойствами элемента ClassType, используйте элемент Column и привяжите его к атрибуту PropertyID.

Атрибут IsRecurring элемента ListSupportClass определяет, выполняется ли автоматическое обновление представления. Атрибут RecurrenceFrequency определяет интервал обновления в миллисекундах. В данном примере интервал обновления установлен в 1 секунду, что не рекомендуется в рабочей среде.

Определение папок

Путем определения папки обозначается расположение в дереве навигации, где будет отображено представление. В данном примере элемент конфигурации определен так, что представление можно разместить только в существующей папке для элементов конфигурации, в рабочей области Элементы конфигурации.

<Folders>  
  <Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />  
</Folders>  
<FolderItems>  
   <FolderItem   
      ElementID="AllProjectorsView"   
      Folder="Folder.Projectors" />  
   </FolderItems>  

В примере выше атрибут ElementID содержит ссылку на созданное представление. Атрибут Folder указывает на папку Folders.Projectors, которая, в свою очередь, имеет корень, как определено в рабочей области Управление конфигурацией в Консоль Service Manager. Данная корневая папка определена в пакете управления "Управление конфигурацией".

Элемент ImageReference сопоставляет созданное представление со значком, определенным в пространстве имен Configuration Management.

<ImageReferences>  
  <ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />  
  <ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />  
</ImageReferences>  

Локализация с помощью раздела LanguagePacks

Раздел LanaguagePacks определяет строковые ресурсы и сопоставления для элементов пакета управления.

В данном примере значения EnumerationValueProjectorCondition.Working должны отображаться как Работает. Для этого следует определить отображаемые имена всех следующих элементов:

  • Представление: Все проекторы

  • Перечисления: работает, неисправен, в ремонте, новый

  <LanguagePacks>  
    <LanguagePack ID="ENU" IsDefault="true">  
      <DisplayStrings>  
        <DisplayString ElementID="AllProjectorsView">  
          <Name>All Projectors</Name>  
          <Description>This displays all projectors</Description>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Working">  
          <Name>Working</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Broken">  
          <Name>Broken</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.BeingRepaired">  
          <Name>In Repair</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.New">  
          <Name>New</Name>  
        </DisplayString>  
      </DisplayStrings>  
    </LanguagePack>  
</LanguagePacks>  
  

При необходимости вы можете создать дополнительные элементы LanguagePack на каждом нужном языке. Пользователю показывается подходящая строка на основании его языкового стандарта.

Ресурсы

Раздел Resources содержит ссылки на двоичные ресурсы, которые находятся в сборках за пределами пакета управления. В приведенном ниже примере определяется ресурс, указывающий на сборку, содержащую форму, которая используется классом Projector.

<Assembly ID="ProjectorFormsAssembly"    
         Accessibility="Public"   
         QualifiedName="SMFormsDemo, Version=1.0.0.0" FileName="SMFormsDemo.dll" CreationDate="1900-10-12T13:13:13" ModifiedDate="2008-12-12T12:12:12" />  

Расширения классов

Расширение класса — это класс, который добавляет свойства в существующий класс. В большинстве случаев существующий класс содержится в запечатанном пакете управления. В тех случаях, когда существующий класс не содержится в запечатанном пакете управления, расширение класса должно содержаться в том же пакете управления, что и расширяемый класс.

Расширение класса наследует свойства всех родительских классов, например:

  • Класс А имеет свойство с именем Свойство1.

  • Класс B является производным от класса А или расширяет его, следовательно, он имеет свойство с именем Свойство1. Это свойство унаследовано от класса А (родительского или базового класса).

  • Определение класса B добавляет свойство с именем Свойство2.

  • Любое расширение класса, производное от класса B, унаследует Свойство1 и Свойство2.

В следующем примере показано определение расширения класса.

  
<TypeDefinitions>  
     <EntityTypes>  
       <ClassTypes>  
         <ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" IsExtensionType="true">  
          <Property ID="TimeOnIncident" Type="int" Key="false" />  
        </ClassType>  
      </ClassTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
  

Это расширение класса расширяет класс System.WorkItem.Incident и добавляет новое свойство с именем TimeOnIncident.

Определение расширения класса похоже на определение класса. Для определения класса используются два атрибута элемента ClassType: атрибут Base и атрибут IsExtensionType.

Атрибут Base определяет ID родительского класса, от которого является производным расширение класса. В данном случае атрибут имеет значение Incident!System.WorkItem.Incident. Это значение содержит Alias полного имени пакета управления и состоит из имени расширяемого класса, восклицательного знака и имени базового класса. Дополнительные сведения см. в следующем примере.

Атрибут IsExtensionType определяет, является ли данный класс расширением базового класса. Поскольку TimeOnIncident является расширением класса Incident, это свойство имеет значение true:

IsExtensionType="true"  

Это свойство также может иметь значение false, которое указывает на то, что данный класс — это не расширение другого класса, а новый класс, унаследованный от базового. По умолчанию используется значение false, поэтому этот атрибут не нужно использовать, если класс не является расширением.

Полный пример

В следующем примере кода показан полный пакет управления, содержащий расширение класса.

<ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="1.1">  
   <Manifest>  
     <Identity>  
      <ID>ServiceManager.Extension</ID>  
      <Version>1.0.0.0</Version>  
     </Identity>  
    <Name>ServiceManagerExtension</Name>  
     <References>  
       <Reference Alias="System">  
        <ID>System.Library</ID>  
        <Version>1.0.2780.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="Incident">  
        <ID>System.WorkItem.Incident.Library</ID>  
        <Version>1.0.2780.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
    </References>  
  </Manifest>  
   <TypeDefinitions>  
     <EntityTypes>  
       <ClassTypes>  
         <ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" Extension="true">  
          <Property ID="TimeOnIncident" Type="int" Key="false" />  
        </ClassType>  
      </ClassTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
</ManagementPack>  
  

Импорт пакета управления с помощью командлета Windows PowerShell

С помощью командлета Windows PowerShell Import-SCSMManagementPack можно импортировать пакет управления Service Manager, например:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

В этом документе не описывается импорт и использование пакетов управления в Консоль Service Manager. Дополнительные сведения об использовании пакетов управления в Консоль Service Manager см. в разделе Using Management Packs in System Center 2012 - Service Manager (Использование пакетов управления в System Center 2012 — Service Manager).

Пример. полного пакета управления

В следующих примерах кода показан полный пакет управления, используемый для примеров в данной статье, а также определение формы и код программной части формы на языке C#.

Пакет управления

<ManagementPack ContentReadable="true" SchemaVersion="1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <Manifest>  
    <Identity>  
      <ID>ServiceManager.Projector</ID>  
      <Version>7.0.3707.0</Version>  
    </Identity>  
    <Name>Projector Library</Name>  
    <References>  
      <Reference Alias="SMConsole">  
        <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="Authoring">  
        <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="System">  
        <ID>System.Library</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="SMConfig">  
        <ID>ServiceManager.ConfigurationManagement.Library</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
    </References>  
  </Manifest>  
  <TypeDefinitions>  
    <EntityTypes>  
      <ClassTypes>  
        <ClassType ID="System.ConfigItem.Projector" Accessibility="Public" Abstract="false" Base="System!System.ConfigItem" Hosted="false" Singleton="false" Extension="false">  
          <Property ID="SerialNumber" Type="int" Key="true" />  
          <Property ID="Make" Type="string" />  
          <Property ID="Model" Type="string" />  
          <Property ID="Location" Type="string" />  
          <Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />  
        </ClassType>  
      </ClassTypes>  
      <EnumerationTypes>  
        <EnumerationValue ID="ProjectorCondition" Accessibility="Public" />  
        <EnumerationValue ID="ProjectorCondition.Working" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.BeingRepaired" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.New" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.Broken" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public" />  
      </EnumerationTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
  <Categories>  
    <Category ID="AllProjectorsView.Category" Target="AllProjectorsView" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ViewTasks" />  
    <Category ID="ProjectorViewHasTasks.CreateTask" Target="AllProjectorsView" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.CreateTypeCategory" />  
    <Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks" />  
    <Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser" />  
  </Categories>  
  <Presentation>  
    <Forms>  
      <Form ID="TestForm" Accessibility="Public" Target="System.ConfigItem.Projector" Assembly="ProjectorFormsAssembly" TypeName="New_CI_lab.TestControl">  
        <Category>Form</Category>  
      </Form>  
    </Forms>  
    <Views>  
      <View ID="AllProjectorsView" Accessibility="Public" Enabled="true" Target="System.ConfigItem.Projector" TypeID="SMConsole!GridViewType" Visible="true">  
    <Category>NotUsed</Category>  
    <Data>  
    <Adapters>  
    <Adapter AdapterName="dataportal:EnterpriseManagementObjectAdapter">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter</AdapterType>  
    </Adapter>  
    <Adapter AdapterName="viewframework://adapters/AdvancedList">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>  
    </Adapter>  
    <Adapter AdapterName="omsdk://Adapters/Criteria">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>  
    </Adapter>  
    </Adapters>  
    <ItemsSource>  
    <AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup"   
  IsRecurring="true" RecurrenceFrequency="5000"  Streaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >  
    <AdvancedListSupportClass.Parameters>  
                <QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>  
    </AdvancedListSupportClass.Parameters>  
    </AdvancedListSupportClass>  
    </ItemsSource>  
    <Criteria />  
    </Data>  
    <Presentation>  
    <Columns>  
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">  
              <mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />  
              <mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />  
              <mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />  
              <mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />  
              <mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />  
            </mux:ColumnCollection>      
    </Columns>  
    </Presentation>  
    </View>  
    </Views>  
    <Folders>  
      <Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />  
    </Folders>  
    <FolderItems>  
      <FolderItem ElementID="AllProjectorsView" ID="FolderItem.AllProjectors" Folder="Folder.Projectors" />  
    </FolderItems>  
    <ImageReferences>  
      <ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />  
      <ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />  
    </ImageReferences>  
  </Presentation>  
  <LanguagePacks>  
    <LanguagePack ID="ENU" IsDefault="true">  
      <DisplayStrings>  
    <DisplayString ElementID="System.ConfigItem.Projector">  
    <Name>Projector</Name>  
    </DisplayString>  
        <DisplayString ElementID="Folder.Projectors">  
          <Name>Projectors</Name>  
          <Description>This is the Projector Folder</Description>  
        </DisplayString>  
        <DisplayString ElementID="AllProjectorsView">  
          <Name>All Projectors</Name>  
          <Description>This displays all projectors</Description>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Working">  
          <Name>Working</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Broken">  
          <Name>Broken</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.BeingRepaired">  
          <Name>In Repair</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.New">  
          <Name>New</Name>  
        </DisplayString>  
      </DisplayStrings>  
    </LanguagePack>  
  </LanguagePacks>  
  <Resources>  
    <Assembly ID="ProjectorFormsAssembly" Accessibility="Public" FileName="New_CI_lab.dll" QualifiedName="New_CI_lab, Version=0.0.0.0" />  
  </Resources>  
</ManagementPack>  

Определение формы

  
<UserControl  
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:SMFormsDemo"  
    x:Class="SMFormsDemo.TestControl"  
    x:Name="Control"  
    Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">  
  <UserControl.Resources>  
    <ObjectDataProvider ObjectType="{x:Type local:helper}"  MethodName="GetStatusValues" x:Key="getStatusValues" />  
  </UserControl.Resources>  
  <Grid x:Name="LayoutRoot">  
    <Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>  
    <TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>  
    <Label Margin="70,60,0,0" HorizontalAlignment="Left"  VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>  
    <TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}" />  
    <Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>  
    <TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>  
    <Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>  
    <TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}" />  
    <Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>  
    <ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
      <ComboBox.SelectedItem>  
        <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
      </ComboBox.SelectedItem>  
      <ComboBox.ItemTemplate>  
        <DataTemplate>  
          <StackPanel>  
            <TextBlock Text="{Binding Path=DisplayName}"/>  
          </StackPanel>  
        </DataTemplate>  
      </ComboBox.ItemTemplate>  
    </ComboBox>  
  </Grid>  
</UserControl>  
  

Код программной части формы

  
using System;  
using System.Collections.Generic;  
using System.Collections.ObjectModel;  
using System.Threading;  
using System.Windows.Controls;  
using Microsoft.EnterpriseManagement.ServiceManager.Application.Common;  
using Microsoft.EnterpriseManagement.UI.DataModel;  
namespace SMFormsDemo  
{  
   /// <summary>  
   /// Interaction logic for ProjectorForm.xaml  
   /// </summary>  
   public partial class TestControl : UserControl  
   {  
        public TestControl()  
      {  
         InitializeComponent();  
      }        
   }  
   public class helper  
   {  
  
      public static ICollection<IDataItem> GetStatusValues()  
      {  
            return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);  
      }  
   }  
}  
  

См. также

Изменения в общей схеме System Center
Формы: общие правила и рекомендации