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中文网其他相关文章!