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中文網其他相關文章!