0

我将 Ninject 2.0 与 MVC 2/EF 4 项目一起使用,以便将我的存储库注入到我的控制器中。我已经读过,在做类似的事情时,应该使用 InRequestScope() 进行绑定。当我这样做时,每个请求都会获得一个新的存储库,但旧的存储库不会被处置。由于旧存储库保留在内存中,因此我与同时存在的多个 ObjectContext 发生冲突。

我的具体存储库实现了 IDisposable:

public class HGGameRepository : IGameRepository, IDisposable
{
    // ...

    public void Dispose()
    {
        if (this._siteDB != null)
        {
            this._siteDB.Dispose();
        }
    }
}

还有我的忍者代码:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = new StandardKernel(new HandiGamerServices());

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        try
        {
            if (controllerType == null)
            {
                return base.GetControllerInstance(requestContext, controllerType);
                // return null;
            }
        }
        catch (HttpException ex)
        {
            if (ex.GetHttpCode() == 404)
            {
                IController errorController = kernel.Get<ErrorController>();
                ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext);

                return errorController;
            }
            else
            {
                throw ex;
            }
        }

        return (IController)kernel.Get(controllerType);
    }

    private class HandiGamerServices : NinjectModule
    {
        public override void Load()
        {
            Bind<HGEntities>().ToSelf().InRequestScope();
            Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope();
            Bind<IGameRepository>().To<HGGameRepository>().InRequestScope();
            Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope();
            Bind<ErrorController>().ToSelf().InRequestScope();
        }
    }
}

我究竟做错了什么?

4

1 回答 1

4

我很确定您对您的对象未处置的猜测是错误的。当你认为它会发生时,这不会发生。但是,这确实在以后发生的事实不应该给你带来任何问题,ObjectContexts除非你做错了什么。ObjectContexts无论如何,在高负载的情况下,您将同时拥有很多。

但是,可能成为问题的是内存使用量增加。这就是为什么需要主动释放请求范围的原因。Ninject MVC 扩展会处理这个问题。否则,请查看 OnePerRequestModule 以了解它是如何完成的:

https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/OnePerRequestHttpModule.cs
于 2012-05-07T07:51:08.493 回答