【问题标题】:Ninject MVC 2 - problems with EF 4 ObjectContextNinject MVC 2 - EF 4 ObjectContext 的问题
【发布时间】:2012-05-10 02:48:40
【问题描述】:

我一直在处理这个问题,但似乎仍然找不到解决方案。我有几个包装 EF 4 ObjectContext 的存储库。下面是一个例子:

public class HGGameRepository : IGameRepository, IDisposable
{
    private readonly HGEntities _context;

    public HGGameRepository(HGEntities context)
    {
        this._context = context;
    }

    // methods

    public void SaveGame(Game game)
    {
        if (game.GameID > 0)
        {
            _context.ObjectStateManager.ChangeObjectState(game, System.Data.EntityState.Modified);
        }
        else
        {
            _context.Games.AddObject(game);
        }

        _context.SaveChanges();
    }

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

我有以下 NinjectModule:

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

由于我使用的是 MVC 2 扩展,因此这些绑定默认为 InRequestScope()

我的问题是没有正确处理 ObjectContext。我得到了这里描述的内容:https://stackoverflow.com/a/5275849/399584 具体来说,我得到一个 InvalidOperationException 状态:

无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。

每次我尝试更新实体时都会发生这种情况。

如果我将我的存储库设置为绑定InSingletonScope(),它可以工作,但似乎是个坏主意。

我做错了什么?

编辑:为清楚起见,我只有一个 ObjectContext 想与每个请求的所有存储库共享。

【问题讨论】:

  • 使用InSingletonScope()没有任何危害。
  • 线程/缓存呢?老实说,我不确定在这种情况下如何工作(我来自 PHP)。

标签: c#-4.0 asp.net-mvc-2 ninject.web.mvc


【解决方案1】:

你必须在你的模块中指定InRequestScope()。基于此article 默认为瞬态,这就是您获得多个上下文的原因。

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

您是否还通过 nuget 包管理器或旧方式将 ninject 添加到您的项目中?

【讨论】:

  • Nuget 包。我认为 MVC 扩展使 InRequestScope() 成为默认值。我的意思是,我在 NinjectWebCommon 中有以下语句: DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));而且,根据智能感知,InRequestScope() 不适合我。
  • 它已被移至您必须使用 Ninject.Web.Common 添加的不同命名空间;然后你就可以调用 .InRequestScope() 我对你在哪里的印象是一样的。但这是我让它工作的唯一方法。我发现一些网站展示了如何设置默认范围,但它涉及继承内核,我不想这样做。
  • 几乎明白了。遇到另一个问题。如果您想看一下,我提出了一个新问题。 stackoverflow.com/q/10526167/399584
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多