entity-framework-4 – 当超出范围时,Ninject不调用对对象的Dispose
|
我很惊讶地发现,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-mvc – ASP.NET MVC日历
- asp.net-mvc-4 – Dapper.net如何创建地图
- asp.net-mvc – 在ASP.NET MVC应用程序中更改日期格式
- .net – 如何创建一个dotnet核心单个可执行文件
- asp.net-mvc-5 – Sharepoint 2013 MVC 5提供商托管的应用程
- asp.net-mvc – 在MVC中检查图像mime,大小等
- asp.net – 无效的回发或回调参数.为什么?
- asp.net-mvc – 使用没有ORM的ASP.NET MVC
- 非锁定进程中的ASP.NET会话状态存储
- asp.net – 使用Team City快照依赖项时,您使用快
- asp.net – UrlRewriting.Net模块IIS7等于Page.U
- asp.net-mvc-4 – 扩展名的URL不能通过路由处理
- asp.net – 为什么IIS线程这么珍贵与常规CLR线程
- asp.net-mvc – 如何将行的模型从Kendo Grid传递
- asp.net – Linq to Sql – 根据环境变量动态设置
- asp.net-web-api – 在WebApi和MVC项目之间共享S
- 向ASP.NET Gridview添加动态列
- 修改FCKEditor实现将图片、文件等保存到数据库
- asp.net – Glass Mapper打破了图像字段的标准值
