1

我正在使用 Prism 4.0 和 MEF 开发 WPF 应用程序。我想在模块 B 的 B 类中创建模块 A 的类 A 的实例,并希望访问 A 类的属性和方法,而不在模块 B 中添加模块 A 的任何引用。我知道 prism 提供此功能,但不要不知道该怎么做。

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

<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>

所有程序集都以功能区面板中的菜单形式加载。

4

2 回答 2

3

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

在 SharedInterfaces 项目中

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

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

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

在 ModuleB 项目中(也引用 SharedInterfaces 项目)

[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
  }
}
于 2013-08-30T10:33:59.590 回答
0

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

接口(C# 编程指南)

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

于 2013-08-30T10:30:06.027 回答