vto*_*ola 5 singleton dependency-injection ef-code-first
我的应用程序中有一些"缓存"对象,IRepository通过依赖注入(Ninject)获得(自定义存储库模式契约).这些对象仅使用存储库一次,但它们具有刷新功能,强制所有者自行刷新.它们是单例,只创建一次,并ManualResetEvent确保所有请求都被阻止,直到它被加载.
这IRepositories是基于EF CodeFirst的,所以可以简单地确保连接关闭并DbContext永远保持对它的引用吗?
我已经禁用了代理和延迟加载,所以...可以从缓存对象的根目录到数百个这些缓存的POCO实体的长引用?
干杯.
最后,我发现的最佳解决方案是创建一种新的包装器:
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<> 委托
干杯。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |