ef code first -在单例中对数据连接进行依赖注入的最佳方法



我的应用程序中有一些"缓存"对象,通过依赖注入(Ninject)获得IRepository(自定义存储库模式契约)。这些对象只使用存储库一次,但是它们有一个Refresh函数,强制所有者刷新自己。它们是单例的,只创建一次,并且ManualResetEvent确保所有请求都被阻塞,直到它被加载。

IRepositoriesEF CodeFirst基于,所以它是可以只是简单地确保连接是关闭的,并保持对DbContext的引用永远存在吗?

我已经禁用代理和延迟加载,所以…从缓存对象的根到数百个缓存的POCO实体的长引用是否可以?

欢呼。

我们参考Julie Lerman的评论,http://msdn.microsoft.com/en-us/magazine/ee532098.aspx?sdmr=JulieLerman建议有几个/许多较小的上下文,在web场景的情况下,每次调用创建一个新的上下文。虽然她写了关于实体框架和AppFabric中的二级缓存。

随着时间的推移,上下文将包含许多对象,性能将相应地下降。我认为这个网站有一些关于EF表现的好建议。例如生成视图。http://msdn.microsoft.com/en-us/data/hh949853

我个人的建议,我不能说这是最佳实践,但从一个关心性能的人的角度来看,是小的有界上下文每次调用都是一个可靠的长期妥协。使用生成的视图使初始加载时间尽可能短。

可以通过从上下文中删除未使用的对象的方式来管理永久DBContext。或者使用带有事件的缓存库来实现。这可不是个小任务。

我对你最终选择的解决方案很感兴趣。请职位。

最后,我发现最好的解决方案是创建一种新的包装器:

    public class Generator<T> where T : IDisposable
    {
        readonly Func<T> _generate;
        public Generator(Func<T> generate)
        {
            _generate= generate;
        }
        public T Generate()
        {
            return _generate();
        }
    }

和创建一个绑定或多或少这样:

// Dependency Injection bindings declaration section
DI.Bind<Generator<IRepository>>()
  .To(()=> new Generator<IRepository>(()=> DI.Get<IRepository>()));
因此,在只需要创建和销毁元素的长寿命对象中,我可以请求Generator<IRepository>服务,而不是IRepository。因此,每次我需要刷新时,我只需创建一个新的IRepository,而不知道它是如何在底层构建的:
 using (var repository = repositoryGenerator.Generate())
 {
     repository.DoStuff();
 }

到目前为止效果很好。

实际上,我已经在我的DI框架中添加了这个特性。现在我可以绑定任何东西,然后根据生成器的请求绑定,框架将使用这种技术为我提供完全准备好的对象。委托以编程方式

欢呼。

最新更新