Criando diretamente um arquivo de Pacote de Gerenciamento para gerenciar projetores
Publicado: julho de 2016
Aplicável a: System Center 2012 SP1 - Service Manager, System Center 2012 R2 Service Manager, System Center 2012 - Service Manager
Os pacotes de gerenciamento são usados para direcionar e ampliar a funcionalidade do System Center 2012 - Service Manager. Este tópico usa projetores como um exemplo para descrever as várias seções de um pacote de gerenciamento e para definir os diversos objetos necessários para gerenciar os projetores em uma organização.
Este tópico contém um exemplo de pacote de gerenciamento completo, com as extensões necessárias para gerenciar projetores em uma organização. Além disso, ele descreve como importar um pacote de gerenciamento usando um cmdlet do Windows PowerShell.
Este tópico descreve as seguintes seções de um pacote de gerenciamento:
O manifesto
TypeDefinitions para criar relações e enumerações de classe
Formulários
Este tópico descreve também as seguintes seções de um pacote de gerenciamento, que contêm declarações e definições de interface de usuário e elementos de localização:
Categorias
Apresentação
Extensões de classe
A seção Manifesto
A primeira seção de um pacote de gerenciamento contém o manifesto. O manifesto identifica o pacote de gerenciamento e declara todas as referências a outros pacotes de gerenciamento.
O exemplo a seguir mostra a seção Manifest de um pacote de gerenciamento que foi projetado para rastrear projetores em uma organização.
<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>
Importante |
---|
|
Seção TypeDefinitions – criando uma classe
A próxima seção de um pacote de gerenciamento contém definições de tipo. A seção TypeDefinitions de um pacote de gerenciamento contém definições de classes, enumerações e relações que são usadas pelo pacote de gerenciamento.
O exemplo a seguir mostra uma classe que contém informações sobre projetores:
<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>
Veja a seguir uma explicação seção a seção do que a definição de tipo contém.
A seção ClassTypes
O elemento ClassType define a classe do projetor:
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
O atributo ID é o identificador exclusivo desta classe. Ele está definido como:
ID="System.ConfigItem.Projector"
O atributo Base é o ID da classe da qual esta classe deriva. Como o projetor é um tipo de item de configuração, isto é definido como:
Base="System!System.ConfigItem"
A notação de System! indica que esta classe, System.ConfigItem, está no pacote de gerenciamento que é referenciado pelo alias System.
O atributo Hosted define se esta classe é hospedada por outras classes. Neste caso, uma instância desta classe poderá existir apenas quando uma instância do host existir contendo-a. Para este exemplo, os projetores não são hospedados por nada; portanto, o atributo Hosted está definido como false:
Hosted="false"
A configuração do atributo Hosted como true indica que a classe é hospedada por outra classe. Uma relação de hospedagem deve ser declarada na seção RelationshipTypes.
O atributo Accessibility define se outras classes podem derivar desta classe. Para os casos em que desejar permitir que outras pessoas criem uma versão mais específica de sua classe, defina o atributo como public, por exemplo:
Accessibility="Public"
A configuração do atributo Accessibility como Internal impede que outras classes derivem desta classe.
O atributo Abstract define se instâncias desta classe podem ser criadas ou se a classe deve apenas ser usada como classe pai, da qual outras classes serão derivadas. Neste exemplo, este atributo está definido como false. A configuração deste atributo como true significa que nenhuma instância desta classe pode ser criada diretamente e que esta classe pode ser usada apenas como classe pai.
A próxima seção da definição de classe contém as propriedades da classe. O XML que define as propriedades de classe deste exemplo está definido no seguinte exemplo de código:
<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" />
Cada elemento de Property tem os seguintes atributos:
O atributo ID, que designa o identificador exclusivo da propriedade.
O atributo Type, que indica os tipos de dados da propriedade.
O atributo Key. A configuração deste atributo como true indica que esta propriedade deve ser usada para identificar exclusivamente esta classe.
Criando tipos de enumeração
Enumerações do tipo de dados enum são tipos de dados especiais. As enumerações são usadas para restringir os dados permitidos para uma propriedade a um conjunto específico de valores. As enumerações podem ser hierárquicas; uma enumeração pode ser baseada em outra.
Elas são definidas na seção EnumertionTypes do pacote de uma solução. Uma definição de enumeração contém a enumeração raiz, seguida por valores reais de enumeração.
Cada EnumerationValue aceita alguns atributos:
Neste exemplo, uma enumeração foi definida para controlar a condição dos projetores. O exemplo a seguir define esta enumeração:
ID é o identificador da enumeração ou o valor da enumeração.
Accessibility especifica se este enumerador pode conter outros enumeradores.
ParentName é um atributo que especifica o ID do pai do valor do enumerador.
<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>
Criando um formulário
Os formulários do Service Manager são baseados nos formulários do WPF (Windows Presentation Framework). O Service Manager amplia o WPF com atributos simples que são adicionados à definição de XML e permitem que o Service Manager vincule dados do pacote de gerenciamento ao formulário.
Os formulários do Service Manager podem ser criados usando várias ferramentas diferentes, inclusive o Microsoft Visual Studio ou o Microsoft Expression Blend. Como os formulários são baseados em XML, eles também podem ser definidos usando qualquer editor de XML.
O exemplo a seguir mostra uma definição de formulário criada usando o Microsoft Expression Blend. Este formulário contém quatro controles, três caixas de texto e uma caixa de combinação, todos vinculados às propriedades da classe Projetor definidas anteriormente.
<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>
Para habilitar a vinculação de controles no formulário para as propriedades da classe definidas no pacote de gerenciamento, vários itens devem ser especificados.
Vinculando controles de texto
Para vincular caixas de texto às propriedades de classe de um pacote de gerenciamento, adicione uma marca Binding Path à propriedade Text do controle da caixa de texto, por exemplo:
{Binding Path=SerialNumber, Mode=TwoWay}
Esta marca vincula o controle da caixa de texto à propriedade SerialNumber da classe Projetor definida no pacote de gerenciamento e especifica que a vinculação deve ser bidirecional. O valor da propriedade é recuperado do banco de dados e exibido na caixa de texto quando o formulário é carregado, e o valor da propriedade é armazenado novamente no banco de dados quando é alterado pelo usuário.
Vinculando caixas de combinação
Para permitir que o formulário recupere dados de enumeração do pacote de gerenciamento subjacente e os vincule a um controle do formulário, uma classe auxiliar deve ser definida no code-behind do formulário. Esta classe auxiliar deve conter um método que retorne uma enumeração definida no pacote de gerenciamento. Para retornar uma enumeração, use o método GetEnumerations do pacote de gerenciamento atual. Esta instância é acessada com a classe ConsoleContextHelper do SDK (software development kit) do Service Manager. No exemplo a seguir, uma classe auxiliar define o método GetStatusValues, que recupera os valores da enumeração de ProjectorCondition definida no pacote de gerenciamento:
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
Para acessar este método, algumas coisas devem ser configuradas na definição do formulário do pacote de gerenciamento.
Primeiro, um namespace que indique o namespace do code behind do formulário é adicionado à definição do formulário. Neste exemplo, o namespace é SMFormsDemo:
xmlns:local="clr-namespace:SMFormsDemo"
Em seguida, um ObjectDataProvider deve ser definido para fornecer os valores à caixa de combinação que exibe o status do projetor. Este ObjectDataProvider está definido como um recurso:
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
Este provedor de dados especifica o objeto e o nome do método que recupera os valores de enumeração do pacote de gerenciamento.
Por último, para vincular a caixa de combinação aos valores de enumeração definidos no pacote de gerenciamento, o atributo ItemsSource é adicionado à definição da caixa de combinação. Este atributo especifica onde recuperar os valores de enumeração, por exemplo:
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
Depois, os elementos SelectedItem e ItemTemplate são adicionados à definição de XAML (Extensible Application Markup Language) do controle da caixa de combinação. O exemplo a seguir mostra a definição da caixa de combinação com a vinculação XAML inclusa:
<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>
A seção Categoria
A seção Category de um pacote de gerenciamento agrupa elementos do pacote de gerenciamento para uma navegação mais simples.
Os dois primeiros elementos de <Category> do exemplo são usados para controlar a exibição das tarefas Novo e Editar da exibição Projetores.
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
Os segundos dois elementos de Category do exemplo do pacote de gerenciamento são usados para fazer com que a enumeração da condição do projetor apareça na exibição Listas do painel Criação, no Service Manager Console. Isso permite que o usuário personalize os valores:
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
A adição desta categoria no exemplo a seguir faz com que a tarefa Editar apareça na exibição Listas para o EnumerationValue indicado no atributo Target:
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
A seção Apresentação
A seção Presentation de um pacote de gerenciamento declara e define os elementos relacionados à interface de usuário. Isso abrange declarações de formulários, categorias e tarefas do console.
A seção Formulários
A seção Forms declara os formulários usados por seu pacote de gerenciamento. O exemplo a seguir especifica onde localizar o formulário que foi definido para exibir e editar instâncias da classe Projetor. Isso vincula o formulário à classe Projetor definida no pacote de gerenciamento:
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
Os seguintes atributos foram usados no exemplo anterior:
O atributo TypeName contém o namespace e o nome da classe do formulário.
O atributo ID contém o identificador exclusivo desta instância do formulário.
O atributo Target contém o nome da classe à qual este formulário está vinculado.
O atributo Assembly indica o recurso externo que contém o formulário.
O atributo Accessibility define se este formulário pode ser personalizado.
Definindo uma exibição
A seção Views de um pacote de gerenciamento contém definições de exibições da interface de usuário. Estas exibições podem ser usadas para filtrar e exibir objetos de um pacote de gerenciamento.
<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>
O atributo Destino de Exibição indica a classe em que a exibição será usada para exibir.
No exemplo anterior, o pacote de gerenciamento do console do Service Manager foi referenciado. Este pacote de gerenciamento contém uma definição do tipo de exibição que está sendo usado. Neste caso, o tipo de exibição SMConsole!GridViewType está definido.
O AdvancedListSupportClass define vários parâmetros, sendo que o mais importante deles é o parâmetro TargetClass. Defina este parâmetro como o ID do ClassType que aparecerá nesta exibição. Para exibir as colunas que são propriedades do ClassType, use o elemento Column e vincule-o ao atributo PropertyID.
O atributo IsRecurring do elemento ListSupportClass determina se a visão é atualizada automaticamente. O atributo RecurrenceFrequency define o intervalo de atualização em milissegundos. Neste exemplo, o intervalo de atualização está definido como 1 segundo, mas isso não é recomendável para instalações de produção.
Definindo pastas
A definição de uma pasta determina o local na árvore de navegação no qual aparece a exibição. Neste exemplo, um item de configuração está definido de modo a ser adequado apenas para posicionar a exibição sob a pasta existente dos itens de configuração no espaço de trabalho Itens de Configuração:
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
No exemplo anterior, o atributo ElementID contém uma referência à exibição que foi criada. O atributo Folder indica uma pasta Folders.Projectors que, por sua vez, tem sua raiz conforme a definição no espaço de trabalho Gerenciamento de Configuração do Service Manager Console. Esta pasta raiz está definida no pacote de gerenciamento do gerenciamento de configuração.
O elemento ImageReference associa a exibição criada anteriormente a um ícone definido no namespace do Configuration Management:
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
Localização usando a seção LanguagePacks
A seção LanaguagePacks de um pacote de gerenciamento define os recursos da cadeia de caracteres e as associações dos elementos do pacote de gerenciamento.
Neste exemplo, o EnumerationValueProjectorCondition.Working deve aparecer como Processando. Para isso, devem ser definidos nomes de exibição para cada uma das seguintes opções:
Exibição: todos os projetores
Enumerações: processando, quebrado, em reparo, novo
<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>
Você poderá criar elementos de LanguagePack adicionais conforme necessário para cada idioma adicional que precisar. A cadeia de caracteres de exibição correta é exibida para o usuário com base na localidade dele.
Recursos
A seção Resources de um pacote de gerenciamento contém referências a recursos binários, que estão contidos em assemblies separados do pacote de gerenciamento. No exemplo a seguir, um recurso está definido para indicar o assembly que contém o formulário usado pela classe Projetor:
<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" />
Extensões de classe
Uma extensão de classe é uma classe que adiciona propriedades a uma classe existente. Na maioria dos casos, essa classe existente está em um pacote de gerenciamento sem lacre. Nos casos em que a classe existente não está em um pacote de gerenciamento sem lacre, a extensão da classe deve estar contida no mesmo pacote de gerenciamento da classe que está sendo estendida.
Uma extensão da classe herda as propriedades de todas as classes pai, por exemplo:
A classe A tem uma propriedade chamada Property1
A Classe B é derivada da Classe A, ou estende a Classe A, e, portanto, tem uma propriedade chamada Property1. Essa propriedade é herdada da Classe A, do pai ou da classe base
A definição de Classe B adiciona uma propriedade chamada Property2.
Qualquer extensão de classe derivada da Classe B herdará Property1 e Property2.
O exemplo a seguir mostra uma definição de extensão de classe:
<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>
Essa extensão de classe estende a classe System.WorkItem.Incident e adiciona uma nova propriedade chamada TimeOnIncident.
A definição de uma extensão de classe é semelhante a de uma definição de classe. Dois atributos do elemento ClassType são usados para definir uma definição de classe: os atributos Base e IsExtensionType.
O atributo Base especifica a ID da classe pai da qual a extensão de classe é derivada. Nesse caso, o valor do atributo é definido como Incident!System.WorkItem.Incident. Esse valor contém o Alias do nome completo do pacote de gerenciamento, que contém a classe que está sendo estendida, um ponto de exclamação e o nome da classe base. Para obter mais informações, consulte o exemplo a seguir.
O atributo IsExtensionType define se essa classe é uma extensão da classe base. Como TimeOnIncident é uma extensão para a classe Incidente, essa propriedade é definida como true:
IsExtensionType="true"
A outra opção é false, o que indica que ela não é uma extensão de outra classe, mas sim uma nova classe herdada da classe base. O valor padrão é false; portanto, esse atributo não precisa ser usado se a classe não é uma extensão.
Exemplo completo
O exemplo de código a seguir mostra o pacote de gerenciamento completo que contém a extensão de classe.
<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>
Importando um Pacote de Gerenciamento por meio de um cmdlet do Windows PowerShell
Você pode usar o cmdlet Import-SCSMManagementPack do Windows PowerShell para importar um pacote de gerenciamento do Service Manager.
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
Este documento não descreve como importar e usar pacotes de gerenciamento no Service Manager Console. Para obter informações sobre o uso de Pacotes de Gerenciamento no Service Manager Console, consulte Usando Pacotes de Gerenciamento no System Center 2012 - Service Manager.
Exemplo: Pacote de Gerenciamento completo
Os exemplos de código a seguir representam o exemplo de pacote de gerenciamento completo que é usado para exemplos neste tópico, além da definição de formulário e do code-behind C# do formulário.
Pacote de Gerenciamento
<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>
Definição de Formulário
<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>
Code-Behind do Formulário
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);
}
}
}
Consulte também
Alterações no esquema comum do System Center
Formulários: diretrizes gerais e práticas recomendadas