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

vto*_*ola 5 singleton dependency-injection ef-code-first

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

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

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

干杯.

vto*_*ola 0

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

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

        public T Generate()
        {
            return _generate();
        }
    }
Run Code Online (Sandbox Code Playgroud)

并或多或少地以这种方式创建绑定:

// Dependency Injection bindings declaration section
DI.Bind<Generator<IRepository>>()
  .To(()=> new Generator<IRepository>(()=> DI.Get<IRepository>()));
Run Code Online (Sandbox Code Playgroud)

因此,在只需要创建和销毁元素的长期存在的对象中,我可以请求服务Generator<IRepository>,而不是IRepository. 因此,每次我需要刷新时,我都会创建一个新的 IRepository,而不知道它是如何在幕后构建的:

 using (var repository = repositoryGenerator.Generate())
 {
     repository.DoStuff();
 }
Run Code Online (Sandbox Code Playgroud)

到目前为止,它就像一个魅力。

事实上,我已经将此功能添加到我的 DI 框架中。我现在可以绑定 IAnything,稍后根据生成器的请求,框架将使用此技术为我提供完全准备好的对象如何以编程方式创建 Func<> 委托

干杯。