Partilhar via


SDK de Proteção de Informações da Microsoft - Observadores do SDK de Política

O Policy SDK contém uma classe de observador. Os membros observadores são virtuais e devem ser substituídos para lidar com retornos de chamada para operações assíncronas.

Quando uma operação assíncrona é concluída, a OnXxx() função de membro correspondente ao resultado é chamada. Exemplos são OnLoadSuccess(), OnLoadFailure(), e OnAddEngineSuccess() para mip::Profile::Observer.

Os exemplos abaixo demonstram o padrão promise/future, que também é usado pelos exemplos do SDK e pode ser estendido para implementar o comportamento de retorno de chamada desejado.

Implementação do Profile Observer

No exemplo a seguir, criamos uma classe, ProfileObserver que é derivada de mip::Profile::Observer. As funções de membro foram substituídas para usar o padrão futuro/promessa usado em todas as amostras.

Nota: As amostras abaixo são apenas parcialmente implementadas e não incluem substituições para os mip::ProfileEngine observadores relacionados.

profile_observer.h

No cabeçalho, definimos ProfileObserver, derivando de , em seguida, substituir cada uma das funções de mip::Profile::Observermembro.

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

Na implementação em si, definimos uma ação a ser tomada para cada função de membro observador.

Cada membro aceita dois parâmetros. O primeiro é um ponteiro compartilhado para a classe manipulada pela função. ProfileObserver::OnLoadSuccess esperaria receber um mip::Profilearquivo . ProfileObserver::OnAddEngineSuccess esperaria mip::ProfileEngine.

O segundo é um ponteiro compartilhado para o contexto. Na nossa implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função projeta isso para std::promisee, em seguida, armazenada em um objeto chamado promise.

Finalmente, o futuro é preparado definindo o promise->set_value() e passando no mip::Profile objeto.

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

Ao executar qualquer operação assíncrona, a implementação do observador é passada para o construtor de configurações ou para a própria função assíncrona.