.NETのAPIコントローラプロジェクトでは、私が使用しているサービス、たとえばSomeService
が必要です(要求ごとまたはSomeServiceインスタンスごとではありません)(ただし、関連性はないと思いますが、この初期化部分:それはSomeService
のすべてのインスタンスに対してこれを行うと、unnecessarely高価であるAPIが作成された後のためAzureストレージにいくつかのセットアップを行いますのでGlobal.asaxのAutofac - DependencyResolver.Current.GetService <>()から作成されたInstancePerRequest - いつ解放されますか?
new SomeService().Init();
に次の行があった、私は。依存関係注入のためにAutofac
を使用します。SomeService
をISomeService
とInstancePerRequest
と登録します(SomeService
はスレッドセーフではないため)。したがって、今度はSomeSerを初期化します。コンテナからのインスタンスを経由してGlobal.asaxの副。私はそれがこのエラーに
An exception of type 'Autofac.Core.DependencyResolutionException' occurred in Autofac.dll but was not handled in user code
Additional information: No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
を与える
container.Resolve<ISomeService>().Init();
に、容器からインスタンスを取得しようとすると、エラーの説明で提案されているようしかし、そのためGlobal.asaxの中、私はインスタンスを取得します。私が知りたいのは何
DependencyResolver.Current.GetService<ISomeService>().Init();
は私がCurrent
から取得SomeService
インスタンスを解放またはされていないということでしょうか?実際のリクエストはないので、わかりません。最悪の場合、new
でコンクリートからインスタンスを取得できます。
あなたにはいくつかの点があります。 IStartableは良い解決策に見えますが、サービスを含むdllに特定のコンテナ(IStartableなど)に関連するものを追加したくありません。オートファックを使用できるものもあれば、他のものを使用するものもあります。また、私が初期化のために別のサービスを構築してシングルトンとして登録する場合、そのインスタンスも解放されません。それは本のほうが多いです、私は同意します。しかし、実際には何も変わりません。私は正しい? –
シングルトンとしてイニシャライザを登録すると、アプリケーションが停止するとインスタンスが破棄されます。しかし、私はあなたがそれを処分する必要がないので本当の問題だとは思わない、私が理解するように、あなたは 'SomeService' –