entity-framework-4 – 当超出范围时,Ninject不调用对对象的Disp
发布时间:2020-12-15 18:49:22 所属栏目:asp.Net 来源:网络整理
导读:我很惊讶地发现,Ninject创建的我的对象中至少有一个不会在请求结束时被处理,当它被定义为InRequestScope 这里是我想要处置的对象: 接口: public interface IDataContext : IDisposable{ MessengerEntities context { get; set; }} MessengerEntities是En
我很惊讶地发现,Ninject创建的我的对象中至少有一个不会在请求结束时被处理,当它被定义为InRequestScope
这里是我想要处置的对象: 接口: public interface IDataContext : IDisposable { MessengerEntities context { get; set; } } MessengerEntities是Entity Framework的ObjectContext的实现 – 我的上下文对象。 然后我创建一个具体的类如下: public class DataContext : IDataContext { private MessengerEntities _context = new MessengerEntities(); public MessengerEntities context { get { return _context; } set { _context = value; } } #region IDisposable Members public void Dispose() { context.Dispose(); } #endregion } 然后我有一个Ninject控制器工厂这样(这是建模在史蒂夫·桑德森MVC 2书): public class NinjectControllerFactory : DefaultControllerFactory { // a Ninject "kernel" is the thing that can supply object instances private IKernel kernel = new StandardKernel(new MessengerServices()); // ASP.NET MVC calls this to get the controller for each request protected override IController GetControllerInstance(RequestContext requestContext,Type controllerType) { if (controllerType == null) return null; return (IController)kernel.Get(controllerType); } private class MessengerServices : NinjectModule { public override void Load() { Bind<IDataContext>().To<DataContext>().InRequestScope(); Bind<IArchivesRepository>().To<ArchivesRepository>().InRequestScope(); Bind<IMessagesRepository>().To<MessagesRepository>().InRequestScope(); } } } 现在,当我在一个断点处调用context.Dispose()在DataContext对象中运行调试器时,该代码永远不会被执行。 所以,证据表明Ninject不处理对象,当他们走出范围,但只是创建新的对象,并依靠垃圾收集器,以摆脱他们在选择的时间。 我的问题是:我应该关心这个吗?因为我 – 我会认为Ninject将处置任何实现IDisposable的对象。 更新:我下载了Ninject Mvc扩展(对于MVC 3),这是现在我如何做MvcApplication和绑定,它似乎是处置我的上下文对象。 在global.asax: public class MvcApplication : NinjectHttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults ); } protected override Ninject.IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); return kernel; } protected override void OnApplicationStarted() { base.OnApplicationStarted(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } } 和 public class EFBindingModule : NinjectModule { public override void Load() { Bind<IDataContext>().To<DataContext>().InRequestScope(); Bind<IArchivesRepository>().To<ArchivesRepository>().InRequestScope(); Bind<IMessagesRepository>().To<MessagesRepository>().InRequestScope(); } } 一切都保持不变。 解决方法
一旦请求对象被GC收集,Ninject就会处理你的对象。但通常这需要一些时间。但是有一种方法可以在请求结束后强制提前处理。最好的方法是使用Ninject.Web.MVC
http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/,而不是实现自己的ControllerFactory。另一种方法是将应用程序配置为使用OnePerRequestModule。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 查询字符串参数使我的应用程序面临风险?
- 使用ASP.NET和IIS进行多线程处理
- 用于ASP.NET的web api – 如何构建对象流
- 将List <>绑定到asp.net中的listview#
- asp.net-mvc – 如何在Visual Studio 2017中构建时嵌入资源
- asp.net-mvc – SignalR – 使用Windows和匿名身份验证时,连
- 如何获取配置文件Web.config的AppSetting节点数据
- asp.net-mvc – ASP.NET MVC快速教程
- asp.net – Windows身份验证和网络服务帐户作为db_owner
- asp.net-mvc – ASP.NET MVC中的Windows Live ID
推荐文章
站长推荐
- asp.net-mvc – 你在哪里把非控制器,非模型代码放
- asp.net – 版本16.1.1.0中不提供AjaxControlToo
- .net – REST API:与身体的GET请求
- 在.NET业务层中构造Vs类
- asp.net-mvc – MVC3,Razor,Html.TextAreaFor():
- ASP.NET MVC HTML Helpers是否被高估?
- asp.net – aspx中的设计视图没有加载
- asp.net – UserPrincipal.FindByIdentity在IIS服
- asp.net – 即使我在Windows 8中安装了协议,Sign
- asp.net – 如何在WebControls和HtmlControls上执
热点阅读