Compartilhar via


Criando uma nova instância com base em propriedades antigas

Uma classe de exibição de junção contém propriedades de instâncias de classe de origem conectadas por um valor de propriedade comum, como Class1.Prop1 = Class2.Prop2. Cada instância em uma classe de exibição de junção consiste em partes de instâncias de classe diferentes.

Você pode basear uma classe de exibição de junção na desigualdade de valores de propriedade, como Class1.Prop1<>Class2.Prop2, em que Prop1 e Prop2 não são mapeados para a mesma propriedade na classe de exibição.

Uma classe de exibição de junção é útil quando as informações que você está procurando estão contidas em classes separadas, mas relacionadas. Por exemplo, se você quiser informações sobre uma impressora e sobre a configuração da impressora, poderá criar uma classe de exibição de junção que contenha algumas das propriedades da classe Win32_Printer e algumas das propriedades da classe Win32_PrinterConfiguration. Sem o provedor de exibição, você deve recuperar e mesclar as propriedades das instâncias separadas para obter as informações necessárias.

O procedimento a seguir descreve como criar uma classe de exibição de junção.

Para criar uma classe de exibição de junção

  1. Inicie uma definição de classe com o qualificador de cadeia de caracteres JoinOn.

    Os qualificadores JoinOn, Association e Union são mutuamente exclusivos.

  2. Se necessário, filtre as instâncias desejadas na classe de junção aplicando o qualificador PostJoinFilter.

    O provedor PostJoinFilter permite restringir as instâncias de uma classe de exibição a instâncias que atendam a condições específicas.

  3. Crie as consultas que definem as instâncias de origem da classe de exibição com o qualificador ViewSources.

  4. Defina os nomes e os locais dos namespaces em que as instâncias de origem estão localizadas com o qualificador ViewSpaces.

  5. Defina as propriedades desejadas em uma classe de exibição de junção com o qualificador PropertySources.

    Quando as propriedades forem adicionadas à exibição de junção com base na igualdade, as duas propriedades de origem devem ser mapeadas em um qualificador PropertySources.

    O exemplo de código a seguir mostra duas propriedades mapeadas em um qualificador PropertySources.

    [PropertySources{"IDProcess", "IDProcess"}] Uint32 ProcessID;
    

    Usando o qualificador HiddenDefault, você pode marcar as propriedades que pertencem a uma classe de origem.

O exemplo de código a seguir mostra uma classe de exibição de junção criada a partir das classes de provedor do Monitor de Desempenho Win32_PerfRawData_PerfProc_Process e Win32_PerfRawData_PerfProc_Thread com propriedades de ambas as classes unidas pela propriedade ProcessID.

#pragma namespace("\\\\.\\root\\cimv2")

instance of __Win32Provider as $DataProv
{
    Name = "MS_VIEW_INSTANCE_PROVIDER";
    ClsId = "{AA70DDF4-E11C-11D1-ABB0-00C04FD9159E}";
    ImpersonationLevel = 1;
    PerUserInitialization = "True";
    
};

instance of __InstanceProviderRegistration
{
    Provider = $DataProv;
    SupportsPut = True;
    SupportsGet = True;
    SupportsDelete = True;
    SupportsEnumeration = True;
    QuerySupportLevels = {"WQL:UnarySelect"};
};

[JoinOn("Win32_PerfRawData_PerfProc_Process.IDProcess = 
    Win32_PerfRawData_PerfProc_Thread.IDProcess"), 
ViewSources{"SELECT Name, IDProcess, PriorityBase 
    FROM Win32_PerfRawData_PerfProc_Process", 
    "SELECT Name, IDProcess, ThreadState, 
    PriorityCurrent FROM Win32_PerfRawData_PerfProc_Thread"},
ViewSpaces{"\\\\.\\root\\cimv2", "\\\\.\\root\\cimv2"},
dynamic: ToInstance, provider("MS_VIEW_INSTANCE_PROVIDER")]

class JoinedProcessThread
{
    [PropertySources{"IDProcess", "IDProcess"}] 
        Uint32 ProcessID;
    [PropertySources{"Name", ""}] 
        String PName;
    [PropertySources{"", "Name"}, key]   
        String TName;
    [PropertySources{"", "ThreadState"}] 
        Uint32 State;
    [PropertySources{"PriorityBase", ""}] 
        Uint32 BasePriority;
    [PropertySources{"", "PriorityCurrent"}] 
        Uint32 CurrentPriority;    
};