Freigeben über


Gewusst wie: Bereitstellung Sie einen Dienst

VSPackage können Dienste bereitstellen, die andere VSPackages verarbeiten kann. Um einen Dienst bereitzustellen, muss ein VSPackage die folgenden Aufgaben ausführen:

Die Package-Klasse implementiert und IServiceProvider IServiceContainer. IServiceContainer hält an, um die Rückrufmethoden lokale und globale bedarfsgesteuerten Dienste bereitzustellen.

Hinweis

Wenn ein VSPackage gerade entladen werden soll Visual Studio wartet, bis alle Anforderungen Dienste übermittelt worden sind, dass ein VSPackage bereitstellt.Er ermöglicht die neue Anforderungen nicht über diese Dienste.Daher sollte die VSPackages RevokeService-Methode nicht explizit aufrufen, um einen Dienst beim Entladen zu widerrufen.

Im folgenden Code wird vom Reference.Services-Beispiel (C#) in Visual Studio-Erweiterbarkeits-Beispieleübernommen. Sie stellt den lokalen Dienst, SMyLocalService und die globale Dienst, SMyGlobalService.

Um einen Dienst bereitstellen

  1. Fügen Sie ProvideServiceAttribute VSPackage hinzu, die die globale Dienst bereitstellt.

    <ProvideService(GetType(SMyGlobalService))> _
    Public NotInheritable Class ServicesPackage
        Inherits Package
    
    [ProvideService(typeof(SMyGlobalService))]
    public sealed class ServicesPackage : Package
    

    ProvideServiceAttribute Register SMyGlobalService mit Visual Studio. Nur der globalen Dienst muss registriert sind. Weitere Informationen finden Sie unter Gewusst wie: Registrieren Sie einen Dienst.

  2. Hinzufügen von Rückrufmethoden dem Dienstcontainer hinzu, um die Dienste zu erstellen.

    Public Sub New()
        Dim serviceContainer As IServiceContainer = TryCast(Me, IServiceContainer)
        Dim callback As New ServiceCreatorCallback(AddressOf CreateService)
        serviceContainer.AddService(GetType(SMyGlobalService), callback, True)
        serviceContainer.AddService(GetType(SMyLocalService), callback)
    End Sub
    
    public ServicesPackage()
    {
        IServiceContainer serviceContainer = this as IServiceContainer;
        ServiceCreatorCallback callback =
           new ServiceCreatorCallback(CreateService);
        serviceContainer.AddService(typeof(SMyGlobalService), callback, true);
        serviceContainer.AddService(typeof(SMyLocalService), callback);
    }
    

    Das true-Flag weist den Dienstcontainer, um SMyGlobalService einen globalen Dienst auszuführen.

    Hinweis

    Visual Studio kann eine Anforderung zurückweisen, einen Dienst bereitzustellen.Hierzu wird, wenn ein anderes bereits ein VSPackage den Dienst bereitstellt.

  3. Implementieren Sie die Rückrufmethode.

    Private Function CreateService(ByVal container As IServiceContainer, ByVal serviceType As Type) As Object 
        If GetType(SMyGlobalService) Is serviceType Then 
            Return New MyGlobalService(Me)
        End If 
    
        If GetType(SMyLocalService) Is serviceType Then 
            Return New MyLocalService(Me)
        End If 
    End Function
    
    private object CreateService(IServiceContainer container, Type serviceType)
    {
        if (typeof(SMyGlobalService) == serviceType)
            return new MyGlobalService(this);
    
        if (typeof(SMyLocalService) == serviceType)
            return new MyLocalService(this);
    
        return null;
    }
    

    ErstellenCreateService entweder SMyGlobalService oder SMyLocalService bei Bedarf.

  4. Implementieren Sie die Klasse des globalen Diensts.

    Public Class MyGlobalService
        Inherits SMyGlobalService
        Implements IMyGlobalService
        Private serviceProvider As IServiceProvider
        Public Sub New(ByVal sp As IServiceProvider)
            Trace.WriteLine("Constructing a new instance of MyGlobalService")
            serviceProvider = sp
        End Sub 
        ' Implement the methods of IMyGlobalService here.  
    End Class
    
    public class MyGlobalService : SMyGlobalService, IMyGlobalService
    {
        private IServiceProvider serviceProvider;
        public MyGlobalService(IServiceProvider sp)
        {
            Trace.WriteLine(
               "Constructing a new instance of MyGlobalService");
            serviceProvider = sp;
        }
        // Implement the methods of IMyGlobalService here.
    }
    

    Die MyGlobalService-Klasse implementiert SMyGlobalService und die IMyGlobalInterface-Schnittstelle, die von diesem Dienst bereitgestellt wird. Der Dienstanbieter, der an den Konstruktor übergeben wird, wird zwischengespeichert, sodass die Schnittstellenmethoden Zugriff auf andere Dienste verfügen.

  5. Implementieren Sie die Klasse des lokalen Diensts.

    Public Class MyLocalService
        Inherits SMyLocalService
        Implements IMyLocalService
        Private serviceProvider As IServiceProvider
        Public Sub New(ByVal sp As IServiceProvider)
            Trace.WriteLine("Constructing a new instance of MyLocalService")
            serviceProvider = sp
        End Sub 
        ' Implement the methods of IMyLocalService here.  
    End Class
    
    public class MyLocalService : SMyLocalService, IMyLocalService
    {
        private IServiceProvider serviceProvider;
        public MyLocalService(IServiceProvider sp)
        {
            Trace.WriteLine(
               "Constructing a new instance of MyLocalService");
            serviceProvider = sp;
        }
        // Implement the methods of IMyLocalService here.
    }
    

Siehe auch

Aufgaben

Gewusst wie: Nehmen Sie einen Dienst in Anspruch

Konzepte

Visual Studio-Erweiterbarkeits-Beispiele

Dienst-Grundlagen

Weitere Ressourcen

Dienste