如何:提供一个服务

VSPackage 可以提供其他 Vspackage 可以使用的服务。 若要提供服务, VSPackage 必须执行以下任务:

Package 类实现 IServiceProvider 和 IServiceContainerIServiceContainer 持有回调方法提供按需本地资源文件和全局服务。

备注

在 VSPackage 是卸载时, Visual Studio 等待所有请求 VSPackage 提供交付的服务。它不允许新的要求这些服务。因此,那么,当卸载时, Vspackage 不应显式调用 RevokeService 方法移除服务。

下面的代码从 Reference.Services 示例 (c#) 则会在 Visual Studio 扩展性示例。 它提供本地服务、 SMyLocalService 和全局服务, SMyGlobalService。

提供服务

  1. 添加 ProvideServiceAttribute 到提供全局服务的 VSPackage。

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

    具有 Visual Studio的ProvideServiceAttribute 注册 SMyGlobalService 。 必须注册只有全局服务。 有关更多信息,请参见 如何:注册服务

  2. 添加回调方法。服务容器创建服务。

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

    true 标志指示服务容器进行 SMyGlobalService 一项全局服务。

    备注

    Visual Studio 可能会拒绝请求提供服务。,如果另一 VSPackage 已提供服务,这。

  3. 执行回调方法。

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

    CreateService 创建 SMyGlobalService 或 SMyLocalService 在要求。

  4. 实现全局服务类。

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

    MyGlobalService 类实现 SMyGlobalService 和此服务提供的 IMyGlobalInterface 接口。 传递给构造函数的缓存服务提供程序,以便接口方法具有对其他 services。

  5. 实现本地服务类。

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

请参见

任务

如何:使用服务

概念

Visual Studio 扩展性示例

服务 Essentials

其他资源

服务