Ninject: オブジェクトのライフタイムと依存関係の注入の処理
質問 1: DbContext のクリーンアップ
の場合Ninject を使用すると、手動で破棄することを心配する必要はありません。 DbContext インスタンス。 Ninject は、InTransientScope() にバインドされていない使い捨てオブジェクトを自動的に破棄します。 InParentScope() または他のスコープを使用している可能性が高いため、対応するスコープがガベージ コレクターによって収集されたときに、Ninject が破棄を処理します。
質問 2: ベース コントローラーでの挿入された DbContext の回避
一般に、MVC コントローラーの基本クラスの使用を避けることをお勧めします。これらは単一責任の原則に違反し、神のオブジェクトにつながる傾向があります。代わりに、グローバルに登録されたフィルタを使用して横断的な問題に対処することを検討してください。
例:
現在のユーザーに基づいて共通の ViewBag プロパティを設定するとします。次のような IAuthorizationFilter を作成できます:
public class CurrentUserProfileFilter : IAuthorizationFilter { private readonly MyDbContext context; public CurrentUserProfileFilter(MyDbContext context) { this.context = context; } public void OnAuthorization(AuthorizationContext filterContext) { // Set ViewBag properties based on current user information from DbContext } }
次に、フィルターを FilterConfig にグローバルに登録します:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { FilterProviders.Providers.Insert(0, new GlobalFilterProvider(DependencyResolver.Current)); } }
これにより、すべてのリクエストで ViewBag プロパティが自動的に設定されます。 MyDbContext をコントローラーに挿入します。
質問 3: 遅延 DB コンテキストインスタンス化
デフォルトでは、Ninject はオブジェクトを積極的に作成しますが、Ninject によってバインドされたオブジェクトを遅延させることもできます (最初のリクエスト時にのみ作成されます)。
ただし、これは推奨されません。 DbContext にはかなりの初期化オーバーヘッドがあるため、その作成を延期しても意味がありません。さらに、DbContext は終了時に破棄される必要があり、その有効期間はそれに応じて制御される必要があります。
以上がNinject は DbContext のライフタイムと依存関係の注入をどのように管理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。