問題タブ [unity-interception]
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.
nhibernate - NHibernate を使用して Unity インターセプションでプロキシから実際のインスタンスを取得する
Unity を使用して、プラグ可能なアーキテクチャの型を動的に解決しています。また、インターセプトを使用して、AOP を介して ( ValidationAspectsを使用して) ビジネス ルールの検証を適用しています。最後に、NHibernate を ORM として使用してドメイン オブジェクトを保持しています。
AOP が機能するためにはVirtualMethodInterceptor
、インターフェイス インターセプトが NHibernate では機能しないため、 を使用します。ISession
リポジトリ操作用のインターフェースと実際の型の間のキャストを処理するファサードがあります。
NHibernate を介してフェッチされたグラフ内のすべてのオブジェクトが AOP に対して適切にプロキシされるようにするために、NHIInterceptor
実装をInstantiate()
作成し、メソッドをオーバーライドしましたnew()
。次にContainer.Resolve()
、検証が挿入されたプロキシ化されたオブジェクトを取得し、これを NH に返して入力します。これは正常に動作します。
問題は、セッション フラッシュが発生したときに発生します。NHibernate は、グラフに表示されるオブジェクトが実際の型ではなくプロキシ型であるため、動揺します。私たちがマッピングしている方法 (すべてプロパティ経由、すべて仮想) NH は、型チェックをオーバーライドできれば、必要なすべての値をプロキシ経由で取得できるはずです。
私が知る必要があるのは、Unity によって作成され、Interception が有効になっている透過的にプロキシされたオブジェクトが与えられた場合、a) プロキシしている「実際の」インスタンスへの直接参照を取得する方法、または b) NH をオーバーライドして処理するように指示する方法はありますか?実行時に動的に、既知のマップされた型であるかのように、プロキシ型のオブジェクト?
c# - AOP インターセプト属性
だから、私はこの問題を抱えており、誰も助けることができないようです。だから、バッシングを続けるのではなく、この特定の猫の皮を剥ぐ別の方法のためにそこに捨てるつもりです.
私は現在、次のものを持っています:
...そしてUnityを使用すると、IOCがセットアップされ、同時に次のような傍受が構成されます。
私が達成したいのは、次のようにインターフェイスに属性を配置できるようにすることです。
... のように定義:
...そして、LogHandlerクラスで、必要なすべてのログを次のように行います:
私が達成したいのは、ハンドラーが呼び出されている名前空間.クラス.メソッド名と、それを呼び出した親名前空間.クラス.メソッド名をログに記録するトレース/ログシステムです。「入力」IMethodInvocation パラメータを使用して必要な情報を取得しようとしましたが、成功しませんでした。問題は、入力が「ICustomerService」インターフェイスを返し、親のスタックフレームをチェックすると、親の実装されたクラスが返されることです (例: . CustomerService) エンティティ ID として namespace.class.methodname を使用してツリー構造を作成しようとすると、ID と親 ID が一致しないことを意味します。
[Log] 属性にパラメーターをドロップしても、実際には機能しません。そこに何を入れることができるのでしょうか? インターフェース名を入力しても、1つのIDがインターフェースであり、親が実装クラスである上記と同じ問題がまだあります。そして、実装クラス名をインターフェイスの属性に入れることはできません。これは、そもそもインターフェイスを持つという目的を無効にするためです!
それがジレンマです。誰か新鮮なアイデアを思いつきましたか?
.net - WPF用のPrismv2でのUnityとのインターセプト(私には機能しません)
Prism v2(2009年10月)でインターセプトを使用できません。パブリックプロパティのセッターをインターセプトし、プロパティが変更された場合はPropertyChangedイベントを発生させようとしています。コードが実行されていることがわかります(デバッガーをステップスルーするか、デバッグポイントを追加します)。ただし、これらのプロパティにバインドされているWPFウィンドウコントロールは更新されません。これらのイベントをサブスクライブしてコンソールに印刷すると、プロパティ変更通知を印刷できます。
したがって、ビューにViewModelのプロパティを更新するテキストボックスがある場合、ViewModelのプロパティが更新されます。ただし、ビューのボタン(DelegateCommandとして実装)によってプロパティが更新される場合、イベントがトリガーされてコンソールが出力されても、そのプロパティにバインドされているテキストボックス(TwoWay Binding Mode)は更新されません。どのプロパティが更新されたかに関する情報。誰かがこの問題に遭遇しましたか?
これが私が書いたサンプルのWPFアプリケーションです。Wordpressではzipファイルのアップロードが許可されていないため、名前をpdf拡張子に変更しました(ファイルの名前をzip拡張子に変更します)。私が間違っていることを教えてください。前もって感謝します。
unity-container - Unityを使用して子メソッド呼び出しをインターセプトする
PIAB / Unityを使用して、「子」メソッド呼び出しをインターセプトすることは可能ですか?
たとえば、クラスには3つのメソッドがあります...
DoSomething()メソッドはDoFirst()を呼び出し、DoFirst()はDoSecond()を呼び出します。
DoSomethingの傍受はできますが、DoFirstとDoSecondでは何も得られません。さまざまなポリシーインジェクションルールを試しました...タイプマッチング、タグ属性、メソッド署名...しかし何も機能しません。しかし、直接呼び出すと、各メソッドをインターセプトできます
だから基本的な質問...あなたもこれを行うことができますか?
もしそうなら、どのように!
c# - Microsoft Unity: Resolve の代わりに BuildUp を使用するとインターセプトが機能しない
Microsoft Unity 2.0 を使用していますが、傍受拡張機能が期待どおりに機能しません。
次の 2 行のコードを検討してください。
これらの 2 行では、someObject に期待する動的プロキシが得られません! このようなシナリオで傍受を機能させるにはどうすればよいでしょうか?
c# - Unity: インターセプトを使用して 2 つのインターフェイスを 1 つのシングルトンとして登録する
2 つのインターフェイスを実装するクラスがあり、クラスのメソッドにインターセプトを適用したいと考えています。
Unity Register two interfaces as one singletonのアドバイスに従っていますが、結果には驚いています。一言で言えば、私の CallHandler が 2 回呼び出されているようです。私が持っている最短の例はこれです:
次の出力が得られます。
「container.RegisterType I2, C」行を削除すると、ログが 1 回だけ表示されます。I2 に似た 3 番目のインターフェイス I3 を追加すると、ログが 3 回表示されます。
Log が 1 回だけ呼び出されることを期待していました。LogCallHandler が別の LogCallHandler から呼び出されているかどうかを検出することでおそらくこれを達成できますが、これは洗練されていないようです。
もともと、インターセプト動作を I1 と I2 に個別に適用するのではなく、C に適用したかったのですが、これには C が MarshalByRefObject から継承する必要があり、これはまだ課したくない制約です。
別の方法はありますか?
unity-container - インターセプトは、それが作成するオーバーヘッドに見合うだけの価値がありますか?
私は、NHibernate をコード ベースに導入するための重要な取り組みの真っ最中です。データベースからロードしたエンティティに依存関係を注入できるように、ある種の DI コンテナーを使用する必要があると考えました。そのコンテナとして Unity を選びました。
Unity の傍受メカニズムを使用してトランザクションの側面をコードに追加することを検討しているので、たとえば次のことができます。
ハンドラーは、[Transaction]
セッションとトランザクションの作成、トランザクションのコミット (または例外のロールバック) などを処理します。
この種のインターセプトを使用すると、コードのほぼすべての場所で Unity を使用することになるのではないかと心配しています。この方法でアスペクトを導入した場合、 を決して呼び出しnew SomeService()
てはなりません。そうしないと、トランザクションを持たないサービスを取得することになります。これは製品コードでは許容されますが、テストではオーバーヘッドが大きすぎるようです。たとえば、これを変換する必要があります。
これに:
これにより、使用しているモック オブジェクトごとに 2 行が追加され、かなりの量のコードが作成されます (テストでは多くのステートフル モックを使用するため、テスト クラスに 5 ~ 8 個のモック オブジェクトが含まれることは珍しくありません。時にはそれ以上。)
スタンドアロンの注入はここでは役に立たないと思います。テストで使用するクラスごとに注入を設定する必要があります。これは、テストが作成された後にクラスにアスペクトが追加される可能性があるためです。
ここで、傍受の使用をやめると、次のようになります。
確かにそれほど良くはありませんが、それほど悪くはないようです。
私は自分の貧しい人の傍受を設定することさえできます:
その後、インターセプターはクラスの属性を処理できますが、使用してクラスをインスタンス化することはでき、new
機能が失われることを心配する必要はありません。
Unity インターセプトを使用するより良い方法はありますか?オブジェクトのインスタンス化に常に使用する必要はありませんか?
c# - Unityインターセプト:パラメーターをICallHandler実装に渡す方法は?
次のようにメッセージパラメータをICallHandler実装に渡すことはできますか?
そして、次のように使用します。
?
unity-container - 傍受可能なタイプのポリシーを指定する
次のコードがあるとします。
現在の構成方法では、Interceptable のインスタンスを解決してパブリック仮想メソッドを呼び出すたびに、(両方のポリシーから) 4 つの一致するルールが試行されます。
これにより、実際のアプリでオーバーヘッドが発生する場合があります。私がやりたいことは、(たとえば) 'PolicyName' ポリシーのみを Interceptable クラスのインスタンスに適用するように指定することです。これを行う方法はありますか?
ありがとう