Dependency injection 单例数据连接依赖注入的最佳方法

Dependency injection 单例数据连接依赖注入的最佳方法,dependency-injection,ef-code-first,singleton,Dependency Injection,Ef Code First,Singleton,我的应用程序中有一些“缓存”对象,它们通过依赖项注入(Ninject)获得IRepository(自定义存储库模式契约)。这些对象只使用存储库一次,但它们具有一个刷新功能,强制所有者刷新自身。它们是单例,只创建一次,ManualResetEvent确保在加载之前阻止所有请求 i位置是基于EF CodeFirst的,因此只需确保连接已关闭并将对DbContext的引用永久保留在那里就可以了吗 我已经禁用了代理和延迟加载,所以。。。可以从缓存对象的根长引用数百个缓存的POCO实体吗 干杯。我们参考朱

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

i位置
是基于EF CodeFirst的,因此只需确保连接已关闭并将对
DbContext的引用永久保留在那里就可以了吗

我已经禁用了代理和延迟加载,所以。。。可以从缓存对象的根长引用数百个缓存的POCO实体吗


干杯。

我们参考朱莉·勒曼的评论, 建议使用几个/多个较小的上下文,在web场景中,每次调用都创建一个新上下文。 尽管她在实体框架和AppFabric中写了第二级缓存

随着时间的推移,上下文将包含许多对象,性能将相应下降。 我认为这个网站有一些关于EF性能的好提示。 例如生成的视图。

我个人的建议是,我不能说这是最佳实践,但从关心性能的人那里得到的建议是,每次调用都是一个可靠的长期妥协。 使用生成的视图使初始加载时间尽可能短

您可以通过从上下文中删除未使用的对象的方式来管理永久DBContext。或者使用带有事件的缓存库来执行此操作。这不是一件小事


我对您最终选择的解决方案感兴趣。请发布。

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

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

        public T Generate()
        {
            return _generate();
        }
    }
到目前为止,它很有魅力

实际上,我已经在我的DI框架中添加了这个特性。我现在可以绑定IAnything,以后可以根据Generator的请求进行绑定,框架将使用这种技术为我提供完全准备好的对象

干杯

// Dependency Injection bindings declaration section
DI.Bind<Generator<IRepository>>()
  .To(()=> new Generator<IRepository>(()=> DI.Get<IRepository>()));
 using (var repository = repositoryGenerator.Generate())
 {
     repository.DoStuff();
 }