Sdílet prostřednictvím


Základy služeb

Služba je kontrakt mezi dvěma balíčky VSPackage. Jeden balíček VSPackage poskytuje specifickou sadu rozhraní pro další balíček VSPackage, který se má využívat. Visual Studio je sama kolekcí balíčků VSPackage, které poskytují služby dalším balíčkům VSPackage.

Pomocí služby SVsActivityLog můžete například získat rozhraní IVsActivityLog, které můžete použít k zápisu do protokolu aktivit. Další informace naleznete v tématu Postupy: Použití protokolu aktivit.

Visual Studio také poskytuje některé předdefinované služby, které nejsou zaregistrované. Balíčky VSPackage můžou nahradit integrované nebo jiné služby tím, že poskytují přepsání služby. Pro libovolnou službu je povoleno pouze jedno přepsání služby.

Služby nemají žádnou zjistitelnost. Proto musíte znát identifikátor služby (SID) služby, kterou chcete využívat, a musíte vědět, která rozhraní poskytuje. Referenční dokumentace ke službě poskytuje tyto informace.

  • Balíčky VSPackage, které poskytují služby, se nazývají poskytovatelé služeb.

  • Služby poskytované jiným balíčkům VSPackage se nazývají globální služby.

  • Služby, které jsou k dispozici pouze pro balíček VSPackage, který je implementuje, nebo do jakéhokoli objektu, který vytvoří, se nazývají místní služby.

  • Služby, které nahrazují předdefinované služby nebo služby poskytované jinými balíčky, se nazývají přepsání služeb.

  • Služby nebo přepsání služby se načítají na vyžádání, to znamená, že poskytovatel služeb se načte, když služba, kterou poskytuje, vyžaduje jiný balíček VSPackage.

  • Aby poskytovatel služeb podporoval načítání na vyžádání, zaregistruje své globální služby v sadě Visual Studio. Další informace naleznete v tématu Postupy: Poskytování služby.

  • Po získání služby použijte QueryInterface (nespravovaný kód) nebo přetypování (spravovaný kód), abyste získali požadované rozhraní, například:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • Spravovaný kód odkazuje na službu podle svého typu, zatímco nespravovaný kód odkazuje na službu podle jeho identifikátoru GUID.

  • Když Visual Studio načte balíček VSPackage, předá poskytovatel služby do balíčku VSPackage, aby získal přístup K balíčku VSPackage globálním službám. To se označuje jako "siting" balíčku VSPackage.

  • Balíčky VSPackage mohou být poskytovateli služeb pro objekty, které vytvářejí. Formulář může například odeslat požadavek na barevnou službu do rámce, který může požadavek předat sadě Visual Studio.

  • Spravované objekty, které jsou hluboce vnořené nebo vůbec nejsou, můžou volat GetGlobalService přímý přístup ke globálním službám.

Použití GetGlobalService

Někdy může být potřeba získat službu z okna nástroje nebo řídicího kontejneru, který nebyl sited, nebo jinak byl sited s poskytovatelem služeb, který neví o požadované službě. Můžete například chtít zapisovat do protokolu aktivit z ovládacího prvku. Další informace o těchto a dalších scénářích najdete v tématu Postupy: Řešení potíží se službami.

Většinu služeb sady Visual Studio můžete získat voláním statické GetGlobalService metody.

GetGlobalService spoléhá na poskytovatele služeb uloženého v mezipaměti, který se inicializuje při prvním inicializaci jakéhokoli balíčku VSPackage odvozeného z balíčku. Musíte zaručit splnění této podmínky nebo jinak být připravena pro službu s hodnotou null.

GetGlobalService Naštěstí většinu času funguje správně.

  • Pokud balíček VSPackage poskytuje službu známou pouze jinému balíčku VSPackage, služba VSPackage, která žádá o službu, se vytvoří před načtením balíčku VSPackage.

  • Pokud je okno nástroje vytvořené nástrojem VSPackage, bude sada VSPackage uložena před vytvořením okna nástroje.

  • Pokud je kontejner ovládacího prvku hostovaný oknem nástroje vytvořeným balíčkem VSPackage, je balíček VSPackage umístěn před vytvořením kontejneru ovládacího prvku.

Získání služby z okna nástroje nebo kontejneru ovládacího prvku

  • Vložte tento kód do konstruktoru, okna nástroje nebo kontejneru ovládacího prvku:

    IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
        if (log == null) return;
    

    Tento kód získá službu SVsActivityLog a přetypuje ji do rozhraní IVsActivityLog, které lze použít k zápisu do protokolu aktivit. Příklad najdete v tématu Postupy: Použití protokolu aktivit.