我想创建自己的服务并具有全球知名度。为了实现这一点,我遵循了此示例解决方案。
一切顺利,我可以在一个类中调用我的服务,该类是从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] 删除。
我来说两句