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-web-api – WebAPI:403在发布网站后被禁止
 - asp.net-mvc – URL中的ASP.NET MVC冒号
 - asp.net-core – 加密ASP.Net Core中的连接字符串和其他配置
 - asp.net-mvc – 图像URL中的符号MVC导致一个潜在危险的Requ
 - asp.net – 获得“System.Web.Mvc.Html.MvcForm”一页
 - asp.net-mvc – 如何在ASP.NET MVC中使用单选模式创建ListB
 - asp.net-mvc-2 – 带有数组/列表的ASP.NET MVC 2模型
 - asp.net – 如何MSDeploy构建的网站包到一个处女IIS网站
 - asp.net-mvc – ASP.NET MVC获取具有特定配置文件属性的用户
 - asp.net – UpdatePanel中的动态创建控件?
 
