AddScoped()はAsp.netコアの外でどのように動作しますか?


1

Azure Webジョブとして実行するコンソールアプリケーションで依存関係注入を使いたいとしましょう。そうすることで、関連するAsp.netアプリケーションで使用するカスタムサービス登録メソッド「AddATonOfServices()」を再利用しています。

私の質問は、どのように "AddATonOfServices()"でAddScoped()を使って登録されているサービスがコンソールアプリケーションで動作するのでしょうか?彼らはTransientやSingletonのように振る舞いますか?予期しない動作がありますか?

ありがとうございました。

3

IServiceScopeFactoryでスコープを作成すると、スコープとして解決されます。

// provider is the root container 
using(var scope = provider.GetService<IServiceScopeFactory>().CreateScope()) 
{ 
    var scopedService = scope.ServiceProvider.GetRequiredService<IScopedService>(); 
    // do something 
} 
// scope will be disposed and all scoped and transient services which implement IDisposable 

あなたはは、ルートコンテナからサービスをスコープ、それが効果的にシングルトンとなります解決した場合は、私も根本から解決した場合、だから、

  0

(限り、アプリケーションが行うように<code>provider</code>命を仮定)コンテナトランジェントとして登録されたサービスはシングルトンになりますか?それを取得したときに登録された方法に関係なく、シングルトンになりますか? 12 8月. 172017-08-12 18:49:45

  0

いいえ、transientは常に一時的です。しかし、スコープ付きサービスは、ルートコンテナから解決されると有効なシングルトンになります。 12 8月. 172017-08-12 18:52:34

+1

"スコープ付きサービスをルートコンテナから解決すると、事実上シングルトンになります"これはサービスプロバイダの構築方法によって異なります。スコープされたインスタンスをルートコンテナから解決できないようにする 'BuildServiceProvider'オーバーロードがあります。この過負荷は、1.0リリース後に追加されました。 'BuildServiceProvider(validateScopes:true)'を呼び出すことは、サービスプロバイダが不平を言うことなく、シングルトンに依然としてトランジェントを注入することができるので、やはりハーフベークの解決策です。 13 8月. 172017-08-13 13:05:08