代码之家  ›  专栏  ›  技术社区  ›  TimothyP

在MEF/PRISM应用程序中配置并向所有模块公开一个单例

  •  2
  • TimothyP  · 技术社区  · 14 年前

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

    并将它们传递给正在加载的模块的构造函数,但我正在尝试做一些不同的事情。

    当应用程序启动时,它将导入IControllerClient的实现。 应用程序中的每个模块都应该可以访问它。

    我不想在Shell上有公共属性或公开

    更新: 重新表述下面的问题

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

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

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

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

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

    [ImportingConstructorAttribute()]所以我希望注入依赖项 此时自动。。。然而,使用这段代码,甚至永远也达不到构造函数。

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

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

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

    更新2:

    1 回复  |  直到 14 年前
        1
  •  2
  •   Dan Bryant    14 年前

    对于MEF,Shared是默认值,因此接口的每个导入都将解析为同一个实例。该实例的配置可以发生在类的构造函数中,也可以实现 IPartImportsSatisfiedNotification


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