如何在wpf中使用prism创建另一个模块的类的实例而不添加引用

本文关键字:模块 实例 引用 添加 另一个 创建 wpf prism | 更新日期: 2023-09-27 18:29:47

我正在使用Prism 4.0和MEF开发WPF应用程序。我想在模块B的类B中创建模块A的类A的实例,并想在不添加模块B中模块A的任何引用的情况下访问类A的属性和方法。我知道棱镜提供了这个功能,但不知道如何做到。

我们在配置文件中指定了所有程序集,如下所示:

<modules>
    <module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleA, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleA" startupLoaded="true"/>
    <module assemblyFile="ModuleB.dll" moduleType="ModuleB.ModuleB,ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleB" startupLoaded="true"/>
</modules>

所有部件都以功能区面板中的"菜单"形式加载。

如何在wpf中使用prism创建另一个模块的类的实例而不添加引用

通常不直接使用Prism IModule实例,它们只是模块dll的入口点。继续说,我假设ModuleA.dll在ModuleB.dll中的某个地方实现了所需的功能。这确实是Prism的典型使用方式,但问题的解决方案更多地与MEF和依赖项注入有关:基本上,您可以为所需的任何功能创建一个接口,在A中实现该接口并使用该接口(即,不知道/不关心在B中在何处以及如何实现)。示例:

在SharedInterface项目中

public interface IMenuStuff
{
  void DoSomething( .... )
}

在ModuleA项目中(引用SharedInterface项目)

[Export( typeof( IMenuStuff ) ]
public class MenuStuff : IMenuStuff
{
  public void DoSomething( .... )
  {
    ...
  }
}

在ModuleB项目中(也参考SharedInterface项目)

[ModuleExport( typeof( ModuleB )]
class ModuleB : IModule
{
  [Import]
  private IMenuStuff Menu { get; set; }
  public void Initialize()
  {
    //when reaching this point, and ModuleA was loaded properly
    //Menu will have been set by MEF to the instance exported in ModuleA
  }
}

我认为没有办法实现您需要对模块a的引用才能使用类a。无论如何,你可以尝试使用接口:

接口(C#编程指南)

接口属性(C#编程指南)