Udostępnij za pośrednictwem


Zapewnianie usługi

Pakiet VSPackage może udostępniać usługi, których mogą używać inne pakiety VSPackage. Aby zapewnić usługę, pakiet VSPackage musi zarejestrować usługę w programie Visual Studio i dodać usługę.

Klasa Package implementuje zarówno klasy , jak IServiceProvider i IServiceContainer. IServiceContainer Zawiera metody wywołania zwrotnego, które zapewniają usługi na żądanie.

Aby uzyskać więcej informacji na temat usług, zobacz Service essentials (Podstawowe informacje o usłudze ).

Uwaga

Gdy pakiet VSPackage zostanie zwolniony, program Visual Studio czeka na dostarczenie wszystkich żądań dotyczących usług dostarczanych przez pakiet VSPackage. Nie zezwala na nowe żądania dla tych usług. Nie należy jawnie wywoływać RevokeService metody w celu odwołania usługi podczas zwalniania.

Implementowanie usługi

  1. Utwórz projekt VSIX (Plik>nowy>projekt>Visual C#>Rozszerzalność>VSIX projektu).

  2. Dodaj pakiet VSPackage do projektu. Wybierz węzeł projektu w Eksplorator rozwiązań i kliknij pozycję Dodaj nowy element Visual C# Items Extensibility Visual Studio Package (Dodaj>nowy element>Visual C# Items>Extensibility>Visual Studio Package).

  3. Aby zaimplementować usługę, należy utworzyć trzy typy:

    • Interfejs opisujący usługę. Wiele z tych interfejsów jest pustych, czyli nie ma metod.

    • Interfejs opisujący interfejs usługi. Ten interfejs zawiera metody do zaimplementowania.

    • Klasa, która implementuje zarówno usługę, jak i interfejs usługi.

      W poniższym przykładzie przedstawiono podstawową implementację trzech typów. Konstruktor klasy usługi musi ustawić dostawcę usług.

    public class MyService : SMyService, IMyService
    {
        private Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider;
        private string myString;
        public MyService(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp)
        {
            Trace.WriteLine(
                   "Constructing a new instance of MyService");
            serviceProvider = sp;
        }
        public void Hello()
        {
            myString = "hello";
        }
        public string Goodbye()
        {
           return "goodbye";
        }
    }
    public interface SMyService
    {
    }
    public interface IMyService
    {
        void Hello();
        string Goodbye();
    }
    
    

Rejestrowanie usługi

  1. Aby zarejestrować usługę, dodaj element ProvideServiceAttribute do pakietu VSPackage udostępniającego usługę. Oto przykład:

    [ProvideService(typeof(SMyService))]
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [Guid(VSPackage1.PackageGuidString)]
    public sealed class VSPackage1 : Package
    {. . . }
    

    Ten atrybut rejestruje się SMyService w programie Visual Studio.

    Uwaga

    Aby zarejestrować usługę zastępującą inną usługę tą samą nazwą, użyj polecenia ProvideServiceOverrideAttribute. Należy pamiętać, że dozwolone jest tylko jedno zastąpienie usługi.

Dodawanie usługi

  1. W inicjatorze VSPackage dodaj usługę i dodaj metodę wywołania zwrotnego, aby utworzyć usługi. Oto zmiana w celu wprowadzenia do Initialize metody:

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Zaimplementuj metodę wywołania zwrotnego, która powinna utworzyć i zwrócić usługę lub wartość null, jeśli nie można jej utworzyć.

    private object CreateService(IServiceContainer container, Type serviceType)
    {
        if (typeof(SMyService) == serviceType)
            return new MyService(this);
        return null;
    }
    

    Uwaga

    Program Visual Studio może odrzucić żądanie udostępnienia usługi. Robi to, jeśli inny pakiet VSPackage już zapewnia usługę.

  3. Teraz możesz pobrać usługę i użyć jej metod. W poniższym przykładzie pokazano użycie usługi w inicjatorze, ale możesz uzyskać usługę w dowolnym miejscu, w którym chcesz korzystać z usługi.

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    
        MyService myService = (MyService) this.GetService(typeof(SMyService));
        myService.Hello();
        string helloString = myService.Goodbye();
    
        base.Initialize();
    }
    

    Wartość powinna mieć wartość helloString "Hello".