如何将我的服务注册为全局服务,或者如何在我的方案中使用MEF?

加博尔·多蒙科斯(GáborDomonkos)

我想创建自己的服务并具有全球知名度。为了实现这一点,我遵循了示例解决方案。

一切顺利,我可以在一个类中调用我的服务,该类是从Package抽象类扩展的,它是这样的:

public class ClientPackage : Package
{
   private void GetGlobalServiceCallback(object sender, EventArgs args)
   {
      IMyGlobalService service = GetService(typeof(SMyGlobalService)) as IMyGlobalService;
   }
}

因为我在Package中,所以可以轻松地调用GetService并获得服务。但是,如果我想从不扩展Package抽象类的类中获取服务,该怎么办?

例如,我有一个实现ITagger接口的类。如果要在此类中获得服务,则必须以这种方式使用Package.GetGlobalService()方法:

var txtMgr = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));

我试图通过Package.GetGlobalServie()获得自己的服务,但是我总是得到null。链接的示例代码不包含针对我的问题的解决方案。

我可能会错过一些东西,或者我的服务情况有误吗?

编辑:

好的,假设我必须使用MEF来获取我的服务,因为我无法通过Package.GetGlobalService()来获取我的服务。

我有一个解决方案,其中有2个项目。一个是类库,其中包含如下接口:

public interface INamesAccessor
{
    IEnumerable<string> GetNames();
}

另一个项目是VSPackage(第一个项目有一个引用),它也实现了我的接口:

[Export(typeof(INamesAccessor))]
public sealed class BitbucketExtensionPackage : Package, INamesAccessor
{
    private IEnumerable<string> _names { get; set; }

    public IEnumerable<string> GetNames()
    {
        return _names;
    }
}

假设如果用户单击“工具”菜单下的给定菜单,则逻辑将设置名称的值。直到_names为空。

我想在我的提供商处使用此_names列表的内容,例如:

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TagType(typeof(CommentTag))]
internal sealed class CommentTaggerProvider : ITaggerProvider
{
    [Import]
    public INamesAccessor _namesAccessor { get; set; }

    public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
    {
        if (buffer == null)
            throw new ArgumentNullException("buffer");

        return buffer.Properties.GetOrCreateSingletonProperty(() => new CommentTagger(buffer, _namesAccessor )) as ITagger<T>;
    }
}

我在这里得到了namesAccessor,但每个字段均为空,_names IEnumerable也为空。

当用户单击菜单按钮时,是否有一种方法可以强制MEF再次导入我的访问器?我怎么了

谢谢您的回答!:)

斯拉克斯

您应该使用MEF为您的扩展程序编写服务;而不是旧的基于COM的ServiceProvider东西。

将所有实际代码放入MEF导出的类中,然后使用该SComponentModel服务从包类中调用它们

有关更多信息,请参阅我的博客

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何在Phonegap中使用jQuery使用Rest服务

如何在我的服务中使用此变量?(角度10)

如何在我的服务类中使用 EntityManager?

是否可以在服务中使用HostListener?或者如何在Angular服务中使用DOM事件?

如何在我使用kubernetes的领事(Hashicorp-consul)中将Vault(Hashicorp-vault)注册为服务?

如何在云中安装服务器2012以及如何将我的用户放置在不同的位置

如何将我的Google Assistant应用连接到我自己的服务器

如何将我的服务注入我的控制器angular js

如何将我的 url 流量重定向到我自己的 linux 服务器?

如何将我的域名路由到我的服务器?

如何在@Component声明中使用服务或全局函数?

如何在 VS2017 中将我的 WCF 服务更改为 RESTful 服务?

如何使用我的注册域设置 XAMPP 服务器?

如何使用systemd将我自己的服务器作为服务启动

我的ISP如何将我的IP地址发送到我的DHCP服务器(路由器)?

docker-compose如何将我的服务名称映射到IP地址?

如何将我的Ubuntu服务器连接到VirtualBox Ubuntu来宾安装

gitx如何将我的“分离头”提交回到主服务器

如何将我的 Nginx 实例指向另一个 pod 的 ClusterIP 服务?

如何将我的MX记录设置到远程服务器

如何将我的应用程序与数据库服务器连接

如何将我的Elastic Search服务器暴露在互联网上?

如何将我的机器人迁移到Azure Bot服务?

如何将我的Ubuntu台式电脑作为服务器?

如何将我的RESTful应用程序部署到Apache服务器?

如何将我的打字稿文件连接到服务器

如何将我的云代码部署到AWS Elastic Beanstalk?(解析服务器)

如何将我的 Xamarin 应用程序与本地 mySQL 服务器连接?

如何在我的eureka服务器上注册python微服务(春季启动)