こんにちは、PRISM WPF MVPアプリケーションがあります。同じモジュール内のビュー間でデータを共有する状態にするのが好きです。デフォルトでPRISMは状態を持っていないので、私がこれを実装することができる方法があるかどうか疑問に思いました。現在私はバックストアとして辞書を使って状態を注入しました、しかし問題はその全体的なものです、すなわちモジュールを渡って利用可能です。このインジェクションをモジュール固有のものにしたいのです。
私は単一性が私の持っている唯一の選択が私のシナリオのためにそれを利用することであるかどうか確かではない、名前に基づいて同じインターフェースに異なるクラスを登録することを可能にすると信じます。
どんな助けも素晴らしいだろう!ありがとう!
-ioWint
回答:
回答№1は0私は同意します、UnityのModuleNameへの型登録を開始する場所とすることを同意します。
回答№2の場合は0
ローカル(モジュールレベル)状態オブジェクトを状態を共有したいすべてのビュー。状態オブジェクトを定義するインタフェースが自分のモジュールに対してローカルである場合、他のモジュールはインタフェースを参照できないため、状態オブジェクトを参照できません。
そう: Module AがIStatefulContainerを実装するオブジェクト(これもModule Aで宣言されています)を3つ持っていて、IStatefulContainerがRegisterTypeではなくRegisterInstanceを使ってUnityに登録されている場合。
私の好みは州を管理する "州"サービスを持つことでしょう。これが必要な場合は、ここにさらに機能を追加することができます。これはより「プリズム」なアプローチです。
EDIT
この状態オブジェクトを複数のモジュールにわたって使用している場合は、次のことができます。
1)使用したいモジュールが参照するアセンブリにインターフェイスを配置します。
アセンブリA
public interface IBlah
{
string Add(string stateKey, string stateValue);
}
Assembly B (referencing Assembly A)
public class Module:IModule
{
private IUnityContainer _container;
public Module(IUnityContainer container)
{
_container=container;
}
public void Initialize()
{
IBlah blah1=new BlahContainer();
IBlah blah2=new BlahContainer();
_container.RegisterInstance<IBlah>(blah1,"BlahContainer1");
_container.RegisterInstance<IBlah>(blah2,"BlahContainer2");
}
}
モジュールC(アセンブリAを参照)
_container.Resolve<IBlah>("BlahContainer1");
_container.Resolve<IBlah>("BlahContainer2");
基本的に、アセンブリ内でインタフェースを定義しますいくつかのプロジェクトは他のモジュールによって使用されるサービスインターフェースを含む "インフラストラクチャ"またはCommonアセンブリを持っています - これはここでよく合うでしょう。
それから、私たちのモジュールにそれが含まれている契約を含むアセンブリを参照させます。
現時点では「魔法の文字列」に頼っていますが、これを回避する方法はたくさんあります。
これがもう少し明確であることを願っています。
回答№3の場合は0
あなたの最新の解決策をありがとう。 私はプレゼンターにモジュール状態登録キーを知らせることを強いる名前ベースのユニティ登録を避けようとしていました。 私はUnityでstackoverflowの投稿を読んでいて、ここで議論を見つけました UnityでMethod Injectionを使用するときにパラメータ値を上書きすることは可能ですか? .
数時間の試行錯誤の末、私は目的の機能を実現しました。
私がしたこと:
私は私のモジュール - > BaseModule用のBaseClassを持っています:IModule私はInfrastructure.Interfaceで定義されている私のIStateServiceに準拠した状態プロパティを持っています。 BaseModule()コンストラクターでこのStateプロパティをインスタンス化します。 注:このアプローチで行くために私は私のプレゼンターにパブリックIStateService Stateを持たせる必要があります。
モジュールにプレゼンターを登録する時点で、私は指定しています
<UnityContainer>.RegisterType<MyPresenter, new InjectionProperty("State", State).
プレゼンターの公共施設を無効にしていますこれは、モジュールで定義されたStateインスタンス値を持つ "State"という名前を持ちます。 このようにして、各ビューのプレゼンターの状態としてモジュール状態を取得できます。
解決策に向かって私を導いてくれてありがとう。
-ioWint