問題タブ [prism-6]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Prism と MEF を使用して複数回初期化された静的変数
環境
Windowsの作成を担当するInteractionWindowPresenter
クラスがあります。それらのいくつかはモーダルである可能性があり、アプリケーションの他の部分に通知するために、開いているモーダル ウィンドウの数のカウンターを保持したいと考えています。
したがって_modalsCount
、モーダルウィンドウが開いたり閉じたりするたびに更新される変数をクラスに追加しました。
初期化時に、各Prism モジュール- つまり。各クラスの実装IModule
- InteractionWindowPresenter
ウィンドウに表示する必要があるビューごとにインスタンス化し、それへの参照を保持します。例えば:
クラスは、InteractionWindowPresenter
すべてのモジュールおよび他のインフラストラクチャ アセンブリによって直接参照されるインフラストラクチャ アセンブリで定義されます。ランチャー アプリケーションからは参照されませんMefBootstrapper
。したがって、合成にはMEFが使用されます。
問題
初期化行にブレークポイントを設定すると、インスタンスの作成_modalsCount
時に実行されないことがわかります。InteractionWindowPresenter
代わりに、変数が各モジュールで最初に使用されたときに (そのときだけ) 実行されます。Show
メソッドが各モジュールから初めて呼び出されたとき。したがって、各モジュールには独自の値があり、その特定のモジュールのすべてのインスタンスで共有されます。
遅延評価がの好奇心beforefieldinit
によるものであることは理解しています。ただし、モジュールごとではなく、アプリケーション全体に対して 1 回だけ評価が行われることを期待していました。
また、静的コンストラクターで初期化を実行しようとしました。
この場合、静的コンストラクターはインスタンス コンストラクターの実行前に呼び出されますが、インスタンスが作成されるたびに呼び出されます。したがって、変数はもはや静的ではないようです。
私の理解では、static
変数は ごとに 1 回初期化されますAppDomain
。したがって、すべてのアセンブリ (モジュールとインフラストラクチャ) が同じ にあるためAppDomain
、これは発生しないはずです。これら2つの仮定のいずれかで間違っていますか?
これまでに採用された回避策
カウンターを保持する単純なクラスを作成すると、この問題を回避できます。
したがって、呼び出しを次のように置き換えます_modalsCount
。
と:
それで、私はここで何が欠けていますか?静的変数のライフサイクルとスコープを何らかの形で誤解したのでしょうか、それとも Prism モジュールや MEF が私をいじっているのでしょうか?
prism - Prism 6 の XAML 名前空間
数か月間、次の XAML 名前空間宣言を使用して Prism 6 を使用してきました。
しかし、この名前空間 URL (GitHub にリダイレクトする) も存在することに気付きました。
どの名前空間を使用するのが正しいか確認してください。
prism-6 - Prism 4 から Prism 6 への移行 - CompositePresentationEvent
Prism 4 で作成されたプロジェクトを Prism 6 に移行したいと考えています。
Prism 4 では、CompositePresentationEvent<T>
型はMicrosoft.Practices.Composite.Presentation.Events
名前空間の下にあります。
しかし、ナゲットから Prism 6 をプルして古い Prism 4 参照を削除したところ、Prism 6 名前空間のどこにもこのイベント タイプが表示されませんでした。
誰でも私を少し助けることができますか?
c# - アクセス違反を引き起こす UWP ナビゲーション
私は WP 8.1 アプリを UWP に変換しています。プリズムの使用に興味があったので、アプリをゼロから構築しようと考えました。別のページに移動するボタンを含むページを作成し、アプリを展開して試してみました。ボタンをクリックしてナビゲートすると、次のコードが実行されます
その後、アプリがクラッシュします。VS2015 の出力ウィンドウを見ると、下部に次のように表示されます。
The program '[4760] MyApp.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'.
どちらのページにも ViewModels があり、 Prisms を使用して設定されていViewModelLocator.AutoWireViewModel
ます。ViewModels のすべてのプロパティをクリアして、コードなしで空にしようとしましたが、何もしませんでした。ビュー モデル コンストラクターにブレークポイントを配置すると、デバッグ時にこのポイントに到達します。
これが何を意味するのか、または他にどこを見るべきか考えていますか?
更新:問題は、コントロール テンプレートが原因のようです。すべての XAML をコメントアウトしてから、1 つずつ追加し直すことで、問題をボタン コントロールに絞り込みました。次に、問題の原因となっているコントロールを見つけたので、バインディングとスタイル テンプレートを削除しました。バインディングを元に戻すとすべて問題なく、テンプレートを元に戻すと問題が発生しました。
c# - Prism 6 UriQuery クラスが見つかりませんか?
UriQuery
Prism 6 のクラスに何が起こったのか知っている人はいますか? チュートリアルに従っているだけで、下にあると表示さMicrosoft.Practices.Prism
れていますが、名前空間がすべて変更されているため、見つかりません。
c# - ログイン後のユーザー モジュールのロード
アプリケーションには、バックエンド サーバーによって認証されるログイン ページがあります。その後、アプリケーションはユーザーの役割を要求できます。ロールに基づいて、アプリケーションはユーザーのモジュールをロードする必要があります。ログアウトすると、アプリケーションが閉じます (少なくとも今のところは)。
このアプリケーションは、最新バージョンの Unity Bootstrapper、Prism-6、wpf を使用し、デスクトップです。
どうすればこれを達成できますか?
wpf - カルチャ変更後のwpfプリズム6リフレッシュビュー
シェルには、メニューとメインの 2 つの領域があります。
MenuModule
MenuView
メニュー領域を埋めるWelcomModule
メイン領域をWelcomeView
満たすWelcomeView
DynamicResource
ラベル コンテンツの用途
MenuModule
文化の変化を処理します:
- 文化を変える
- リソース辞書を変更する
- イベントを公開
LanguageChangedEvent
WelcomeModule
申し込むLanguageChangedEvent
DynamicResource
変更された辞書に基づいてリロードするようにビューを更新するにはどうすればよいですか?
unit-testing - Moq、Prism 6、およびイベント集約による単体テスト
プロパティを適切に設定するか、結果として他のメッセージを発行することにより、モジュールが適切に応答することを確認するために、イベント集約を介してモジュールにメッセージをスローすることにより、モジュールを単体テストしたいと考えています。私は Prism 6 を使用しています。私のプロジェクトでは、インフラストラクチャ プロジェクトに次のものがあります。
ModuleA は次のようなメッセージを発行します。
ModuleB は次のようなメッセージを受け取ります。
これがHandleImportantMessageです:
ModuleB コンストラクターは次のように呼び出されます。
このコンストラクターは Prism フレームワークによって呼び出されます。単体テストのために、ModuleB のインスタンスを作成し、IEventAggregator (おそらく Moq によって作成された偽物) を渡す必要があります。そして、公開するメッセージに重要な文字列が含まれるように、これを行いたいと考えています。「moq とイベント集約を使用した単体テスト」というフレーズを Google で検索すると、いくつかの参考文献がありますが、これらのアプローチを使用して ModuleA から ModuleB に「importantString」を渡す方法はわかりませんでした。Prism 5 のサンプル コードは偽のイベント アグリゲーターを作成しますが、Moq は使用しません。それがどのように機能するのか理解できず、文字列を渡す方法がわかりません。
私のテストコードは次のようなものから始まります:
私が見た参照のいくつかは、.Returns(eventBeingListenedTo.Object); のようなものを適用します。Setup適用後のmoqEventAggregatorへ。importantString を渡すには、明らかに .Setup(something) を moqImportantMessage に適用する必要がありますが、正確にはまだわかりません。
私は何が欠けていますか?偽の公開メッセージで文字列を渡すにはどうすればよいですか?
c# - C++/CLI プロジェクトでポータブル クラス ライブラリを参照するにはどうすればよいですか?
Prism.Core を参照する C# コードがたくさんあります。Prism.Core は移植可能なクラス ライブラリです。これを C++/CLI で参照してデリゲート コマンドを使用しようとすると、次のようになります。
C4691: 'System::Object': 参照された型は、参照されていないアセンブリ 'System.Runtime' で予期されていました。代わりに、現在の翻訳単位で定義された型が使用されました
誰でも理由を説明できますか?また、ソースを再構築する以外に、修正する方法はありますか? Prism が c# ソースに取り込まれているため、やりたくありませんでした。