EF4.0,存储库和Ninject 2

时间:2011-06-03 19:39:05

标签: c# entity-framework-4 ninject ninject-2

这是我面临的两个持续存在的问题的延续:Problems trying to attach a new EF4 entity to ObjectContext while its entity collection entities are already attachedEF4.0 - Is there a way to see what entities are attached to what ObjectContext during debugging?我正在利用这个空间提出另一个有点复杂的问题,我不想做出巨大的问题我的其他话题中的超长问题。

所以,快速破解:

我有来自DTO的传入表单数据。我想将DTO映射到实体(游戏实体)。皱纹是游戏包含一个我必须创建的EntityCollection和基于DTO中int []的Game()(每个整数代表一个平台的ID)。而且,自然而然,EF4窒息的部分原因在于它是一种多对多的关系,而且我认为,因为有一些恶作剧正在发生着多少ObjectContext对象。我不断声称我无法将检索到的平台实体添加到我的新游戏实体,因为它们属于两个不同的ObjectContexts。鉴于我目前的设置,我看不出这是怎么可能的,但我不确定问题还有什么。

好的,所以我有三个存储库,我通过Ninject接口注入注入我的控制器。我在每个中创建ObjectContexts:

public class HGGameRepository : IGameRepository
{
    private HGEntities _siteDB = new HGEntities();

    // rest of repo
}

另外两个存储库以相同的方式构建。

我的Ninject DI代码非常简单:

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

根据我的阅读,这应该为每个HTTP请求创建一次这些绑定。

我想要做的是在所有存储库之间共享我的HGEntities对象的一个​​实例,以确保我有一个且只有一个ObjectContext在运行。我只是不确定该怎么做。

有没有一种标准方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

这是一个选项:

更改您的存储库以在其构造函数中接受IHGEntities接口,并将HGEntities与您的存储库相同地连接到NinjectModule。这样,当您的控制器需要IArticleRepository的实例时,Ninject将实例化HGEntities的实例以传递到存储库或使用当前HTTP上下文中已处于活动状态的实例。

然后,在您的存储库类中,您可以简单地将IHGEntities转换为HGEntities。