gpt4 book ai didi

c# - 配置单例并将其公开给 MEF/PRISM 应用程序中的所有模块

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:10 25 4
gpt4 key购买 nike

我有一个使用 MEF 和 PRISM 的应用程序(只是一个测试)。

加载一些符合特定接口(interface)的导出是相当容易的并将它们传递给正在加载的模块的构造函数,但我正在尝试做一些不同的事情。

当应用程序启动时,它会导入 IControllerClient 的实现。然后需要配置创建的实例(例如通过 shell),之后应用程序中的每个模块都应该有权访问它。

我不想在 Shell 或一些公开的辅助类上拥有公共(public)属性这种情况可能会被认为是一种不好的做法......我真的不喜欢它。

更新: 改写下面的问题

我们在现有框架中定义了许多接口(interface),通常这些是使用 MEF 加载到各种应用程序中。

我能够将它们加载到 Prism 应用程序的模块中,例如:

[ImportingConstructorAttribute()]
public HelloWorldView(IDataTransportService dataTransportService,
IMessageFactory messageFactory,
IDataFactory dataFactory,
IDataProcessor dataProcessor,
IDataCollector dataCollector)
{
var client = new ControllerClient(dataTransportService,
messageFactory,
dataProcessor
dataCollector);
}

在这种情况下,模块会创建 ControllerClient 类的有效实例。

但是我不想将这些接口(interface)传递给构造函数,而是想要一个模块像这样的构造函数:

[ImportingConstructorAttribute()]
public HelloWorldView(IClient client)
{
this.client = client;
}

IClient 实现 (ControllerClient) 的构造函数具有[ImportingConstructorAttribute()] 所以我希望注入(inject)依赖关系此时自动...但是使用此代码,甚至从未达到构造函数。

我想要的是有一个 IClient 接口(interface)的实例,它被应用程序中的所有模块。 (我现在明白 Shared 是 MEF 导入的默认值)。

执行此操作的最佳方法是什么?为什么我不能有一个采用 IClient 的模块构造函数,如果我想以这种方式公开一个类的实例,如果它不知道 mef,该怎么办?

那么在 mef/prism 应用程序中,您将在哪里定义这个可以被所有模块使用的实例?这就是通常所说的服务(但我只能找到有关使用 unity/prism 公开服务的指南)。

我希望这次我能更好地解释我的问题。

更新 2:由于 MEF 导入默认是共享的,我可以在每个模块中导入 IClient 实现,但是我需要弄清楚为什么没有注入(inject)依赖项

最佳答案

对于 MEF,共享是默认设置,因此接口(interface)的每次导入都将解析为同一个实例。该实例的配置可以发生在类的构造函数中,或者您可以实现 IPartImportsSatisfiedNotification在您的“单例”服务类上,当 MEF 完成解析您的类导入时,它将回调。


阅读您更新后的描述,听起来您无法在其构造函数中或在解析其导入后配置该类,因为您需要一些额外的上下文信息。如果是这种情况,您可以做的是在您的 Shell 中手动配置该类,并在使用容器的 ComposeParts 方法创建 Export 后手动添加它。这将使您的“已配置”实例成为将用于解析您已应用于该类的任何 [Export] 标签的实例。当然,在通过依赖于实例的容器构造任何其他内容之前,您必须执行此操作。

关于c# - 配置单例并将其公开给 MEF/PRISM 应用程序中的所有模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3397634/

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