問題タブ [lifetime-scoping]
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.
javascript - Javascript での for ループのスコープ設定
次のコードを検討してください。
x
コンソールにはまだ出力されています。
これにより、JSHintで警告が表示されますx
.
JSHintが聖杯ではないことはわかっていますが、x
リークを防ぐ方法はありますか? (それが正しい用語であると仮定しますか?
私は試した:
だから"use strict";
行く方法ではありません。
私はそれをさらに深く掘り下げてみました(そして、これは私を混乱させるほど混乱させます):
さらに悪いことに:
呼び出しの行で、console.log
JSHintx
は、スコープ外で使用されていること、および次の行で再宣言していること について警告しますx
。
c# - Autofac - コンポーネントは有効期間スコープで定義された依存関係を無視します
ここで何かを誤解している可能性があるので、おそらくここに簡単な答えがあるかもしれませんが、現在頭を悩ませています。
IUnitOfWork を実装するクラス UnitOfWork があります (はいはい知っています)。作業単位のコンストラクターは IPrincipalFactory を取ります。TResponder は、IUnitOfWork を受け取るグラフのトップ レベルです。
ApplicationPrincipalFactory を有効期間スコープ内の特定のインスタンスとして登録しようとしています...これは、HandleAsync 関数に渡されるいくつかのプロパティに依存しています。私は次のことをしています:
私が読んだすべてに基づいて、 BeginLifetimeScope(r => 内で依存関係を定義すると、親コンテナーのバインディングがオーバーライドされるため、解決を呼び出すと、すべてがきちんと一緒にスロットされます。
ただし、例外があります。
このメソッド以外の場所に IPrincipalFactory を登録していません。IUnitOfWork は、外側のスコープで次のように定義されます。
また、有効期間ではなく外側のコンテナーに登録することで問題が発生した場合に備えて、子コンテナー内の unitofwork 登録を再定義しようとしました。
何が欠けているのかわからない...アイデアや提案はありますか?
c# - リクエストごとのライフタイム スコープを持つ ServiceStack セルフホステッド アプリケーション
ServiceStack の使用 自己ホスト Web アプリケーションでのオブジェクトの有効期間管理の問題に行き詰まりました。
私の要件:
- リクエストごとのオブジェクトのライフタイム スコープの必要性。
- ServiceStack IoC アダプターを実装した Castle Windsor IoC を使用しています。
- 私のアプリケーションは、基本クラス AppHostHttpListenerPoolBase (ServiceStack v4) で自己ホストされています
- おそらくいつの日か IIS に移行したいと考えているので、IIS は柔軟でなければなりません。
一般的な問題:
Castle Windsor IoC は、独自の要求ごとの有効期間戦略を実装していますが、http モジュールにバインドされているため、IIS でホストされているアプリでのみ機能します。したがって、オブジェクトの有効期間を処理するために、カスタム IScopeAccessor (Castle Windsor によって提供される) を実装する必要があります。ここでの問題は、現在のリクエストにバインドするために使用できるフックがないことです。
与えられた
GetScope メソッドを実装する必要があります。
私が完了できない主なアイデアが 2 つあります。
[Threadstatic] の使用
MyScopeAccessor に保存するだけです
まだ初期化されていない場合は、最初の GetScope の後に新しいスコープを作成します。
問題:
- 処分しにくい。_currentLifetimeScope を破棄する最善の方法は、AfterEachRequest メソッドをオーバーライドするカスタム IServiceRunner を実装する (または ServiceRunner から継承する) ことです。しかし、AfterEachRequest が実際にリクエスト スレッドで実行されるかどうかは正確にはわかりません。
- IIS に移行すると、いくつかの問題が発生する可能性があります。なぜなら、IIS は広告と要求コンテキストの間の変更不可能なバインディングを保証していないからです。
IRequest インスタンスの使用
MyScopeAccessor に保存するだけです
対応するカスタム ServiceRunner メソッド (OnBeforeEachRequest、OnAfterEachRequest) で現在の有効期間スコープを作成して破棄します。
問題:
- GetScope から現在のリクエストにグローバルにアクセスする方法がわかりません。MyScopeAccessor は、サービスとリクエストについて何も知りません。
また、ServiceStack のデフォルトの Funq IoC がこの問題を解決するかどうかも興味深いです。
task-parallel-library - Simple Injector の Execution Context Scope ライフタイムに登録された依存関係にデータを渡す
Simple Injector で Execution Context Scope または Lifetime Scope のいずれかに登録された依存関係にデータを渡す方法はありますか?
私の依存関係の 1 つは、依存関係チェーンで構築するためにデータの一部を必要とします。HTTP および WCF 要求の間、このデータは簡単に取得できます。HTTP 要求の場合、データは常にクエリ文字列またはRequest.Form
パラメータとして存在します (したがって、から利用できますHttpContext.Current
)。WCF 要求の場合、データは常にOperationContext.Current.RequestContext.RequestMessage
XML に存在し、解析できます。このデータを必要とするインターフェイスの実装に依存する多くのコマンド ハンドラーの実装があり、それらは HTTP および WCF スコープのライフスタイルでうまく機能します。
ここで、Task Parallel Library を使用してこれらのコマンドの 1 つ以上を実行できるようにして、別のスレッドで実行できるようにしたいと考えています。データの一部を構成ファイル、クラス、またはその他の静的アーティファクトに移動することは現実的ではありません。最初に、HTTP または WCF を介してアプリケーションに渡す必要があります。
Task
Simple Injector を使用してハイブリッド ライフスタイルを作成する方法を知っており、既にハイブリッド HTTP / WCF / Execution Context Scope (コマンド インターフェイスは非同期であり、代わりに戻ります) としてセットアップされていますvoid
。また、必要に応じて新しい実行コンテキスト スコープを開始するコマンド ハンドラー デコレーターを作成する方法も知っています。問題は、依存関係チェーンが依存関係の1つを構築するために必要なときに利用できるように、このデータの一部を「保存」する方法または場所(またはできるかどうか)がわからないことです。
出来ますか?もしそうなら、どのように?
アップデート
現在、IProvideHostWebUri
2 つの実装で呼び出されるインターフェイスがあります:HttpHostWebUriProvider
とWcfHostWebUriProvider
. インターフェイスと登録は次のようになります。
したがって、最終的には、このアプローチを根絶しない限り、私の目標は、このインターフェイスの 3 番目の実装を作成することです。これは、ある種のコンテキストに依存して Uri を取得します (これは、他の 2 つの実装の文字列から構築されたものです)。
@Stevenの答えは私が探しているもののようですが、ITenantContext
実装を不変でスレッドセーフにする方法がわかりません。値が含まれているだけなので、使い捨てにする必要はないと思いUri
ます。
c# - SimpleInjector による動的モジュールのロード
Caliburn.Micro を使用し、さまざまな種類のシェルにフレームを提供する WPF アプリケーションがあります。これらのシェルはすべてインターフェースを実装していますIShell
。
例として、ホストとして機能するメイン ウィンドウと、ロードされたさまざまなシェルをホストするタブ コントロール (シェルごとに 1 つのタブ) を取り上げます。各シェルは、タブを閉じることで閉じることができます。
現在、IOC サポート、構成 (属性付き)、および子コンテナーに MEF を使用しています。
ユーザーの操作でシェルが開かれます。プラグイン情報やその他のデータが保存されているファイルを選択します。
このファイル データといくつかの固定タイプ (レポートなど) に基づいて、シェルが作成され、フレームでホストされます。
プラグイン アセンブリに配置されているすべてのコンポーネントとその他のフレームワーク コンポーネントのスコープはシェルに限定する必要があり、その他のコンポーネントはフレームのコンポーネントになります。
ユーザーがタップを閉じると、動的に作成されたスコープを破棄できます。
フレームは現在、プラグイン シェル コンポーネントの作成を担当しており、これらのビュー/ビューモデルをフレーム インフラストラクチャに追加する必要があるためです。
フレーム用のカリバーンブートストラップはこんな感じ
シェルを作成する工場
フレームのメインビューモデルでは、ファクトリが呼び出されます
プラグインは、必要な登録を指定しますが、これもライフタイム スコープになります。
var shells = m_factory.GetAll();
範囲指定されたサービスが意味のある範囲外で要求されていることを除いて、呼び出しは失敗します。
ドキュメントとサンプルを読んだ後、SimpleInjector でそれを構築する方法がわかりません。
子コンテナーの作成と管理は、SimpleInjector では間違っているようです。今、私は何かが恋しいと感じています。
アップデート
はい、ユーザーはタブを切り替えることができ、タブを閉じることができ、VisualStudio によく似ているため、モーダル ウィンドウは使用できません。
ユーザーは、ロードされた画面でファイルを選択します。次に、すべてのプラグイン情報が収集され、プラットフォーム プラグインとマージされます。これで、タブのコンテンツが構築される一連のタイプ (ビューモデル、サービスなど) ができました。
rust - スレッドで静的ライフタイムを使用するにはどうすればよいですか?
私は現在、特にチャネルを介して構造体を渡す場合に、Rust (1.0) のライフタイムに苦労しています。
この簡単な例をコンパイルするにはどうすればよいですか。
私は得る:
line
これが (の 1 回の反復でしか生きられない)理由はわかりますが、これfor
を行う正しい方法が何であるかはわかりません。
- コンパイラが示唆するように、 を に変換する必要
&str
があり&'static str
ますか? 'static
すべての行に寿命がある場合、メモリをリークしていますか?'static
とにかくいつ使用することになっていますか?それは私が避けるべきものですか、それともまったく問題ありませんか?String
チャネル経由で構造体に sを渡すより良い方法はありますか?
素朴な質問で申し訳ありません。すでにかなりの時間をかけて検索しましたが、頭を包み込むことはできません。それはおそらく私の動的言語のバックグラウンドが邪魔をしているのです:)
余談ですが、a を考慮された OK&input[..]
に変換するためのものですか? これは、これを行うために私が見つけることができる唯一の安定した方法です。String
&str