gpt4 book ai didi

mef - 如何在 Metro 风格应用程序中获取导出值 (MEF)

转载 作者:行者123 更新时间:2023-12-01 04:38:50 27 4
gpt4 key购买 nike

我认识到,MEF 仅限于 metro 风格的应用程序。没有容器了,那么我怎样才能获得特定的导出值,如 ILogger logger = container.GetExportedValues<ILogger>(); ?是否有涵盖 MEF 的 Metro 版本的任何教程?

感谢您的帮助,恩尼

最佳答案

我猜您已经发现了 System.CompononentModel.CompositionSystem.CompononentModel.Composition.Hosting 命名空间。

让我在这里给你一个简单的例子(看看你是否遗漏了什么)。

首先你需要一个组件来注入(inject):

public interface IMefTest
{
string Message {get;}
}

[Export(typeof(IMefTest))]
public class MefTest: IMefTest
{
public string Message {get { return "Hello World"; }}
}

接下来您需要设置CompositionService(这类似于容器,但不完全一样)。我们希望将它设置在一个可以经常与之交谈的地方,因为这将是您调用以满足导入的地方(更多信息在此之后的代码片段中)。

我将其粘贴在示例项目的 App.xaml.cs 中:

static System.ComponentModel.Composition.ICompositionService _compositionService = null;
public static System.ComponentModel.Composition.ICompositionService CompositionService
{
get
{
if (_compositionService == null)
((App)App.Current).loadCompositionService();
return _compositionService;
}
}

private void loadCompositionService()
{
// Create a catalog where MEF will search for exported parts to plugin
var catalog = new System.ComponentModel.Composition.Hosting.AssemblyCatalog(GetType().GetTypeInfo().Assembly);
_compositionService = catalog.CreateCompositionService();
}

关于此的一些信息。我们已经设置了一个程序集目录,这意味着 MEF 将仅查询此程序集以查找导出的类型。还有其他类型的目录,我相信您应该能够将 2 个或更多目录组合在一起。

好的,在我的页面中(顺便说一句,我将其构建到 MSDN 上入门文档的 C# HelloWorld 示例中)。

要获取目录中其中一个部件的实例,您只需向要获取的类添加一个属性并添加一个导入属性(也有一些方法可以让它在您的构造函数中指定参数,但我'试图保持简单)

[Import]
public IMefTest Tester { get; set; }

在此示例中,您需要在此类上调用组合服务的 SatisfyImportsOnce 方法。我在构造函数中这样做了,我是这样做的:

if(App.CompositionService != null)
App.CompositionService.SatisfyImportsOnce(this);

(确保服务存在的检查对我来说是过分的..它应该存在)。在该步骤之后,您实际上可以在您的类中使用 Tester.Message 属性。 MEF 中有更多选项。我希望这对您有所帮助(如果对您有帮助,您将我标记为答案,因为我花了宝贵的时间从客户那里为您做这件事)

此外,我知道您想简单地调用一个容器并让它返回某种类型的实例。可以使用其他形式的 MEF 执行此操作,因此我想它应该可以使用 WinRT 完成,但老实说,我现在不确定)。

关于mef - 如何在 Metro 风格应用程序中获取导出值 (MEF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com