問題タブ [dynamic-proxy]
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.
java - Java動的プロキシ
Java動的プロキシとは何ですか、たくさんのチュートリアルがありますが、私たちがこの概念を使用しているところで、私を混乱させています、誰もが実際のアプリケーションの使用法で説明しています
c# - 具体的なクラスからインターセプトプロキシを生成しますか?
クラスのプロパティをインターセプトするプロキシを作成する必要があります。インターフェイスからEmitを使用して動的プロキシを作成する方法を知っていますが、インターフェイスがない場合はどうなりますか?RealProxyを使用するサンプルを見たことがあります(この例:クラスのプロパティが設定されているときにメソッドを呼び出す方法はありますか?)が、型生成と発行を使用して同じことを実現することは可能ですか?可能であれば、具象クラスの「所有者」にMarshalByRefObjectのトレースを表示させたくありません(以下を参照)。
Castleはこれを実行できると思いますが、おそらくRealProxyを隠蔽して使用しているのでしょうか。
c# - インターフェイスメソッド呼び出しを単一のデリゲートに多重化し、逆多重化する
私が探しているものの短いバージョンはこれです:
私は、インターフェイスが与えられると、そのインターフェイスのクラスのペア、1つのマルチプレクサと1つのデマルチプレクサを動的に生成するメカニズムを探しています。これにより、次の形式の汎用デリゲートとの間で呼び出しが変換されますobject AnyCall( int method_selector, object[] arguments )
。マルチプレクサクラスは、構築時パラメータとしてAnyCallデリゲートを受け入れ、デリゲートへのすべての呼び出しを委任することによってインターフェイスを実装します。デマルチプレクサクラスは、構築時パラメータとしてインターフェイスへの参照を受け入れ、メソッドセレクタをオンにしてインターフェイスの適切なメソッドを呼び出し、デリゲートに渡されたパラメータを渡すことで、デリゲートを実装します。
私が探しているものの長いバージョンはこれです:
次のインターフェイスについて考えてみます。
そして、そのインターフェースを実装する次のクラスを検討してください。
次に、上記を利用して次のクラスを検討します。
ここには何も派手なものはありません。
ここで、InvokeFoo()にFooImplementationへの直接参照を与える代わりに、2つの間にいくつかの機能を埋め込み、インターフェイスメソッド呼び出しでいくつかの本当に便利なことを実行できるようにしたいとします。インターフェイスのメソッドの1つが呼び出された回数。または、呼び出しをメッセージに変換して、別のスレッドにあるFooImplementationに配信します。または別の大陸で; または何でも。そしてもちろん、この中間の機能は、IFooableだけでなく、どのインターフェイスでも機能するはずです。
これを実現するには、インターフェイスのメソッドへの呼び出しを単一の汎用デリゲートの呼び出しに多重化し、後でそのデリゲートへの呼び出しからインターフェイスのメソッド呼び出しに逆多重化する方法が必要です。私が考えている代表者は、次の形式になります。
したがって、IFooableインターフェイス用のマルチプレクサの実装は次のとおりです。
そして、これがIFooableインターフェース用のデマルチプレクサの実装です。
上記を利用して、上記のRun1()メソッドとまったく同じことを実現するコードを次に示します。違いは、すべての呼び出しが「AnyCall」デリゲートを通過することです。
私の唯一の問題は、クラスMuxForFooableとDemuxForFooableが手書きされているのに、動的に生成したいということです。それらを生成する次のモックメソッドと、それらのメソッドを使用するコードを検討してください。
上記のRun3()は、上記のRun2()およびRun1()とまったく同じ効果があります。
では、CreateMux()とCreateDemux()の実際の実装を作成したり、作成する方法を知っている人はいますか?
インターフェイスにはメソッドのみが含まれ、プロパティは含まれず、すべてのメソッドはvoidを返し、「ref」パラメータや「out」パラメータを受け入れないと想定できます。(私はこれらのことを可能にする実装を気にしませんが。)
私がやりたいことと同じようなことをするコードサンプルはたくさんありますが、動的コード生成の主題は非常にトリッキーなので、誰かが私がやりたいことをすでに正確に行っていることを期待して、この質問を投稿しています。
CastleProxyのような既存のプロキシフレームワークで何ができるかはわかっていますが、このような単純なタスクに外部フレームワーク全体を使用したり、そのようなフレームワークを使用することで実行時のオーバーヘッドが発生したりすることは望んでいません。CastleProxyのソースコードを見て、その一部を使用して自分のやりたいことを実行する方法を見つけようとしましたが、複雑すぎて意味がわかりませんでした。
編集1:
6か月後、私はこの質問で求めていたことを実行するツールを実装しました。私はそれについての論文を発表するつもりですが、それをする前に、私はネーミングの助けが必要なので、私は別の質問を開きました:ネーミングの助けが必要です(インターフェース呼び出しのマーシャリング)
それまでの間、回答があればお気軽に追加してください。
編集2:
私はこのツールを「絡み合う」と呼び、操作を「絡み合わせる」と「巻き戻し」と呼ぶことにしました。それについて読みたい場合は、ここにあります:michael.gr-絡み合う:インターフェイス呼び出しの正規化
c# - DynamicProxyFactory の使用法
私は WCF [C#] で小さなアプリを作成していますDynamicProxyFactory
。実行時にプロキシ クラスを動的に生成する必要があります。
使い方についての良いページが見つかりません!
nhibernate - NHibernateインターセプターとDynamicProxyを使用したサイドテーブルデータの混合
私は、エンティティのフィールドのローカライズされたバージョンを指定する、対応する1対多の変換テーブルをそれぞれに持つ多数のエンティティがあるという問題に取り組んでいます。(これはすべて、私が上にマップを追加しているレガシースキーマです)。例えば:
- イベント
- ID
- EventTranslation
- EventID
- 言語
- タイトル
- その他のフィールド
したがって、情報をギリシャ語でレンダリングする場合は、2つのテーブルを結合し、Language ='Greek'を指定して、すべての適切な情報を取得します。
私がやろうとしているのは、適切なデータを単一のオブジェクトに直接組み込み、クエリの結果としてそれを返すオンザフライミックスインを構築することです。
そのために、DynamicProxyミックスインを作成するためにNHibernateインターセプターをセットアップしようとしています。それが機能していないことを除いて、そして私は理由がわかりません。これがセットアップです。私がそれを単純化できる限り最善です。
イベントは次のとおりです。
IEvenEntity
リスト用のゲッターとセッターもあります。非常にシンプルで、可能な限り最も明白な方法でEventTranslation
実装されるクラスもあります。IEventTranslation
イベントの流暢なマップ:
それ自体で正常に動作します。イベントを照会して、その翻訳に移動できます。マッピングは良いと確信しています。
インターセプターの形は、KrzysztofKoźmicによる非常にクールなガイドに基づいており、少し関連性のあることを行っています。まず、動的プロキシを使用して実装するスーパーインターフェイスを作成しました。
これが私のNHインターセプターです。明らかに、私は狂ったようにハッキングしています:
DynInterceptorは、リレーションシップバッグに入り、適切な翻訳を取得し、適切な値を返す作業を実際に行うインターセプターです。詳細は呼び出されないため、あまり関連性がありません。
NHインターセプターを接続すると、実行されていることがわかります。実際、NHはキャストをIEvent
正しく取得します(つまり、プロキシは少なくとも作成されています)。しかし、何らかの理由で、それはエンティティの水分補給を完全に台無しにします:
NHがリフレクションを使用してプロパティを設定しているため、機能していないように見えますが、もちろん、IEventをEventに交換したため、ターゲットタイプが間違っています。これを回避する方法はありますか?
また、基本的なアプローチに関しては、NHでこれを行うためのより良い方法はありますか?
java - ProxySelector と Authenticator をデフォルトに戻す
私は、現在の OSGi プロジェクト用にカスタムProxySelector実装を作成することを任されました。プロキシの認証を使用するには、カスタムのAuthenticatorも作成する必要がありました。
OSGi バンドルの開始時にこれらのカスタム実装を設定すると、うまく機能します。しかし、OSGi バンドルは停止/アンインストールできるため、次の質問に至ります。
実装を設定解除し、デフォルト (JVM) 実装を復元するにはどうすればよいですか?
バンドルが開始する間、デフォルトの実装を保存します。
残念ながら、Authenticator にはメソッドがありませんgetDefault()
。
バンドルが停止しているとき、次のように ProxySelector と Authenticator の設定を解除します。
しかし、これはうまくいきません。バンドルが停止すると、接続できなくなります。
私の唯一の説明は、を設定することdefaultSelector
は参照を渡すだけだということです。ProxySelector が破棄されると、これらの参照ポイントがどこにもないため、JVM に有効な ProxySelector がなくなります。私が思いついた最善の解決策は、セレクターを複製することでした。しかし、ProxySelector にはメソッドがありませんclone()
。defaultSelector
をデフォルトの実装 ( sun.net.spi.DefaultProxySelector ) にキャストすることは、最善の解決策ではないかもしれませんが、うまくいく可能性があります。以前に設定された他のカスタム実装をオーバーライドする可能性があるため、問題になる可能性があります。
では、これに対するベストプラクティスは何ですか?
web-services - 受信データサイズのDynamicProxyFactoryエラー
wsdl文字列パスで任意のWebサービスを呼び出すために、dynamicproxyfactoryを使用します。残念ながら、Webサービスが大量のデータに応答すると、例外が発生します。
System.ServiceModel.CommunicationException:Lequotadetaillemaximaleautoriséepourlesmessagesentrants(65536)aétédépassé。オーグメンタールクォータ、utilisezlapropriétéMaxReceivedMessageSizesurl'élémentdelaliaisonappropriéeを注ぎます。---> System.ServiceModel.QuotaExceededException:Lequotadetaillemaximaleautoriséepourlesmessagesentrants(65536)aétédépassé。オーグメンタールクォータ、utilisezlapropriétéMaxReceivedMessageSizesurl'élémentdelaliaisonappropriéeを注ぎます。--- Fin de la trace de la tile d'exception interne ---
サーバースタックトレース:àSystem.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded()àSystem.ServiceModel.Channels.HttpInput.GetMessageBuffer()àSystem.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream inputStream)àSystem.ServiceModel.Channels.HttpInput .ParseIncomingMessage(Exception&requestException)àSystem.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpantimeout)àSystem.ServiceModel.Channels.RequestChannel.Request(メッセージメッセージ、TimeSpanタイムアウト)àSystem.ServiceModel.Dispatcher.RequestChannelBinder。 Request(メッセージメッセージ、TimeSpanタイムアウト)àSystem.ServiceModel.Channels.ServiceChannel.Call(String action、Boolean oneway、ProxyOperationRuntime operation、Object [] ins、Object [] outs、TimeSpanタイムアウト)àSystem.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime操作)àSystem.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)
[0]で再スローされた例外:àSystem.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg、IMessage retMsg)àSystem.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData、Int32 type)àIWS_MG.ProceedOperation String xmlIn)àWS_MGClient.ProceedOperation(String xmlIn)}
この例外は、maxsizeが65536であり、受信したデータサイズが大きいことを意味します。
maxsizeを変更する方法を知っている人はいますか?
参考までに、これは私のコードです:
c# - 基本クラスやインターフェイスがなくても動的プロキシを作成することは可能ですか?
Castle Dynamic Proxy
基本クラスやインターフェイスがなくても、一般的なライブラリを使用して動的プロキシを作成することは可能ですか?実行時に動的なオンザフライクラスを作成することに本当に興味があります。