Udostępnij za pośrednictwem


Zestaw SDK usługi Microsoft Information Protection — obserwatorzy zestawu SDK zasad

Zestaw SDK zasad zawiera jedną klasę obserwatora. Elementy członkowskie obserwatora są wirtualne i powinny być zastępowane w celu obsługi wywołań zwrotnych dla operacji asynchronicznych.

Po zakończeniu OnXxx() operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::Profile::Observer

W poniższych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również używany przez przykłady zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.

Implementacja obserwatora profilu

W poniższym przykładzie utworzyliśmy klasę, ProfileObserver która pochodzi z klasy mip::Profile::Observer. Funkcje składowe zostały zastąpione, aby używać wzorca przyszłości/obietnicy używanego w próbkach.

Uwaga: poniższe przykłady są implementowane tylko częściowo i nie obejmują przesłonięć powiązanych mip::ProfileEngine obserwatorów.

profile_observer.h

W nagłówku definiujemy ProfileObserverelement , wyprowadzając z mip::Profile::Observer, a następnie zastępujemy poszczególne funkcje składowe.

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

W samej implementacji definiujemy akcję, która ma być wykonywana dla każdej funkcji składowej obserwatora.

Każdy element członkowski akceptuje dwa parametry. Pierwszy to udostępniony wskaźnik do klasy obsługiwanej przez funkcję. ProfileObserver::OnLoadSuccess oczekuje się, że otrzyma element mip::Profile. ProfileObserver::OnAddEngineSuccess oczekiwany mip::ProfileEngineprzez program .

Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do elementu , przekazanego std::promisejako shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie przechowywany w obiekcie o nazwie promise.

Na koniec przyszłość jest gotowa, ustawiając promise->set_value() obiekt i przekazując go mip::Profile .

#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

Podczas wykonywania dowolnej operacji asynchronicznej implementacja obserwatora jest przekazywana do konstruktora ustawień lub samej funkcji asynchronicznej.