最后,我找到的最佳解决方案是创建一种新的包装器:
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<> 委托
干杯。