C# 配置并向MEF/PRISM应用程序中的所有模块公开单例

C# 配置并向MEF/PRISM应用程序中的所有模块公开单例,c#,prism,mef,C#,Prism,Mef,我有一个应用程序(只是一个测试),它使用MEF和PRISM 加载一些符合特定接口的导出非常容易 并将它们传递给正在加载的模块的构造函数,但我正在尝试做一些不同的事情 应用程序启动时,将导入IControllerClient的实现。 然后需要配置创建的实例(例如,通过shell),然后 应用程序中的每个模块都应该可以访问它 我不想在Shell上有公共属性,也不想有公开 这种情况可能会被认为是一种不好的做法。。。我真的不喜欢它 更新:重新表述以下问题 我们在现有框架中定义了许多接口, 通常使用MEF

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

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

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

我不想在Shell上有公共属性,也不想有公开 这种情况可能会被认为是一种不好的做法。。。我真的不喜欢它

更新:重新表述以下问题

我们在现有框架中定义了许多接口, 通常使用MEF将其加载到各种应用程序中

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

[ImportingConstructorAttribute()]
public HelloWorldView(IDataTransportService dataTransportService,
                      IMessageFactory messageFactory,
                      IDataFactory dataFactory,
                      IDataProcessor dataProcessor,
                      IDataCollector dataCollector)
{
        var client = new ControllerClient(dataTransportService,
                                          messageFactory,
                                          dataProcessor
                                          dataCollector);
}
[ImportingConstructorAttribute()]
public HelloWorldView(IClient client)
{
   this.client = client;
}
在这种情况下,模块将创建ControllerClient类的有效实例

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

[ImportingConstructorAttribute()]
public HelloWorldView(IDataTransportService dataTransportService,
                      IMessageFactory messageFactory,
                      IDataFactory dataFactory,
                      IDataProcessor dataProcessor,
                      IDataCollector dataCollector)
{
        var client = new ControllerClient(dataTransportService,
                                          messageFactory,
                                          dataProcessor
                                          dataCollector);
}
[ImportingConstructorAttribute()]
public HelloWorldView(IClient client)
{
   this.client = client;
}
IClient实现(ControllerClient)的构造函数具有 [ImportingConstructorAttribute()]所以我希望注入依赖性 自动在这一点上。。。然而,使用这段代码,甚至从未到达构造函数

我想要的是有一个IClient接口的实例,由 应用程序中的所有模块。(我知道现在共享是MEF导入的默认设置)

最好的方法是什么?为什么我不能让模块构造函数接受IClient, 如果我想以这种方式公开一个类的实例,如果它不了解mef呢

因此,在mef/prism应用程序中,您将在何处定义可供所有模块使用的实例?这就是通常所说的服务(但我只能找到使用unity/prism公开服务的指南)

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

更新2:
由于MEF导入的默认值是共享的,因此我可以在每个模块中导入IClient实现,但接下来我需要弄清楚为什么没有为MEF注入依赖项,共享是默认值,因此接口的每个导入都将解析为同一个实例。该实例的配置可以发生在类的构造函数中,也可以在“singleton”服务类上实现,该服务类将在MEF完成类导入解析后回调



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

设置PartCreationPolicy有什么问题?我觉得这正是你需要的。我可能解释错了我的问题。。我会试着重新措辞,对不起,我会尝试,听起来很合理:)就像一个符咒。我使用Container.ComposeExportedValue(客户端);在我的mef引导程序类中,在配置客户端实例之后。现在,模块的构造器只需要一个客户机:-)谢谢!