Partilhar via


Como: fornecer um serviço.

Um VSPackage pode fornecer serviços que outros VSPackages podem consumir. Para fornecer um serviço, o VSPackage deve executar as seguintes tarefas:

O Package classe implementa ambas IServiceProvider e IServiceContainer. IServiceContainercontém métodos de retorno de chamada para fornecer serviços locais e globais sob demanda.

Dica

Quando um VSPackage está prestes a ser descarregado, Visual Studio aguarda até que todas as solicitações de serviços que fornece a um VSPackage foram entregues.Ele não aceita novas solicitações para esses serviços.Portanto, os VSPackages não deve explicitamente chamar o RevokeService método para revogar um serviço ao descarregar.

O código a seguir é obtido do exemplo Reference.Services (C#) na Exemplos de extensibilidade de Visual Studio. Ele fornece o serviço global, SMyGlobalService, SMyLocalService e o serviço local.

Para fornecer um serviço.

  1. Adicionar o ProvideServiceAttribute para o VSPackage que fornece o serviço global.

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

    ProvideServiceAttributeregisters SMyGlobalService with Visual Studio. Apenas o serviço global deve ser registrado. Para obter mais informações, consulte Como: registrar um serviço..

  2. Adicione métodos de retorno de chamada para o contêiner de serviço para criar os serviços.

    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);
    }
    

    O true sinalizador instrui o recipiente de serviço para fazer SMyGlobalService um serviço global.

    Dica

    Visual Studiopode rejeitar uma solicitação para fornecer um serviço.Ele faz isso, se outro VSPackage já fornece o serviço.

  3. Implemente o método de retorno de chamada.

    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;
    }
    

    CreateServicecria um SMyGlobalService ou SMyLocalService sob demanda.

  4. Implemente a classe de serviço global.

    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.
    }
    

    O MyGlobalService classe implementa ambos SMyGlobalService e o IMyGlobalInterface interface fornecida por este serviço. O provedor de serviços passado para o construtor é armazenada em cache para que os métodos de interface tenham acesso a outros serviços.

  5. Implemente a classe de serviço local.

    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.
    }
    

Consulte também

Tarefas

Como: consumir um serviço

Conceitos

Exemplos de extensibilidade de Visual Studio

Conceitos básicos de serviço

Outros recursos

Serviços