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