1

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>

すべてのアセンブリは、リボン パネルのメニューの形式で読み込まれます。

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 に答える