最後に、私が見つけた最善の解決策は、新しい種類のラッパーを作成することです。
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をバインドでき、後でGeneratorの要求に応じて、フレームワークはこの手法を使用して完全に準備ができたオブジェクトを提供します。プログラムでFunc<>デリゲートを作成する方法
乾杯。