Shellのブートストラップで利用できるだけでなく、 PRISMアプリケーション。プリズムを利用したWPF/Silverlightモジュールの作成方法プリズム以外のアプリケーションに埋め込むことも可能
簡単に言えば、PRISMモジュールをシェルから初期化するのではなく、モジュール自体から初期化する方法はありますか?
Ulimateの目標は、非PRISMアプリケーションによって初期化できるWPF/Silverlight PRISMモジュールを持つことです。
Shellのブートストラップで利用できるだけでなく、 PRISMアプリケーション。プリズムを利用したWPF/Silverlightモジュールの作成方法プリズム以外のアプリケーションに埋め込むことも可能
簡単に言えば、PRISMモジュールをシェルから初期化するのではなく、モジュール自体から初期化する方法はありますか?
Ulimateの目標は、非PRISMアプリケーションによって初期化できるWPF/Silverlight PRISMモジュールを持つことです。
これには障壁がありません。
IModule
インターフェイスは、パラメータがない単一のvoid
メソッドを持っています。Initialize()
。
非プリズムアプリケーションは、そのメソッドを呼び出すことによってモジュールを初期化できます。それでおしまい。
他のアプリケーションは、異なるインターフェースと、モジュールはそのインターフェイスもを実装することができ、およびどのインタフェースが使用は、単にInitialize()
を呼び出すことができる初期化方法、またはその逆の本体、異なるプラグインシステムを持っている場合。例えば
:
public interface IMyPluginModule
{
void StartModule();
}
public class MyModule : IModule, IMyPluginModule
{
public void Initialize()
{
// actual initialization code here
}
public void StartModule()
{
Initialize();
}
}
それは一見見た目よりも少し複雑ですが、それはなんとかです。あなたはまだプリズム4を使用している場合、私は知らないが、もしそうであれば、Microsoftは実際に、このシナリオのためのガイダンスを提供します。あなたが実行している2つのプロジェクトを取得するために行う必要があり、プロジェクトの操作のビットがあり
http://msdn.microsoft.com/en-us/library/ff921109(v=PandP.40).aspx
並んで。実際のサンプルを見る必要がある場合は、「MultiTargeting」と呼ばれるPrism v4に含まれるサンプルがあります。
オーケストレーションのシェル/ブートストラップを使用するのではなく、モジュール自体を初期化することについてのご質問は間違ったアプローチです。基本的には、WPFとSilverlightの2つのシェルになります。サンプルを見て、あなたの考えを見てください。
これが役に立ちます。
しかし、モジュールは、Non-prismアプリケーションからUnityContainer、RegionManager、またはEventAggregatorのハンドルを取得するか、ハンドルがnullの場合はモジュールを作成する必要がありますか? – dev999
私はあなたが "ハンドルを手に入れよう"という意味を理解していませんが、このプリズム以外のアプリケーションがこれらのものを使用しているかどうかに依存します。例えば、あなたのモジュールが 'IUnityContainer'を扱うように設計されていて、他のアプリケーションがCastle Windsorを使用しているのであれば、すべての呼び出しをWindsorに委譲する新しい' IUnityContainer'実装を作成したいと思うでしょう。 'IRegionManager'と同じことです。また、プリズムコンポーネントを消費する代わりに、DI、ビュー管理、イベント集約などを委譲する抽象レイヤーを追加してモジュールを設計します。 – Jay
私がやったことはあなたが提案したあなたの代わりのアプローチです。しかし、何とかIModule内からIUnityContainerとIRegionManagerを初期化することは、私にとってはうまくいかないようです。私はコンテナと、一般的なboostrapperで言及されている他のすべてのものを設定しましたが、モジュールintialiserに渡されたコンテナ(非プリズムの)を使ってコードから領域を動的に追加する方法はわかりません。私はRegionManager.SetRegionName(コンテナ、 "MainControlRegion")を使用しました。 RegionManager。UpdateRegions();しかし、それは役に立たないようです。 – dev999