5

我的应用程序中有一些“缓存”对象,它们IRepository通过依赖注入(Ninject)获得(自定义存储库模式合同)。这些对象只使用存储库一次,但它们具有强制所有者刷新自身的刷新功能。它们是单例,只创建一次,并ManualResetEvent确保所有请求都被阻塞,直到它被加载。

IRepositories它们是基于EF CodeFirst 的,所以只需确保连接已关闭并DbContext永远保持对那里的引用就可以了吗?

我已经禁用了代理和延迟加载,所以......可以从缓存对象的根目录对数百个这些缓存的 POCO 实体进行长引用吗?

干杯。

4

2 回答 2

2

我们参考 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。或者使用带有事件的缓存库来执行此操作。不是一个小任务。

我会对您最终选择的解决方案感兴趣。请张贴。

于 2013-01-21T13:50:47.983 回答
0

最后,我找到的最佳解决方案是创建一种新的包装器:

    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 框架中。我现在可以绑定 IAnything 和稍后请求生成器,框架将使用此技术为我提供完全准备好的对象如何以编程方式创建 Func<> 委托

干杯。

于 2013-10-24T14:37:37.797 回答