汎用のLazyクラスを使用して、.netコア依存性注入拡張機能を備えた高価なクラスをインスタンス化しようとしています。 IRepoタイプを登録しましたが、Lazyクラスの登録がどのようになるか、またはサポートされているかどうかはわかりません。回避策として、私はこの方法を使用しました http://mark-dot-net.blogspot.com/2009/08/lazy-loading-of-dependencies-in-unity.html
設定:
public void ConfigureService(IServiceCollection services)
{
services.AddTransient<IRepo, Repo>();
//register lazy
}
コントローラ:
public class ValuesController : Controller
{
private Lazy<IRepo> _repo;
public ValuesController (Lazy<IRepo> repo)
{
_repo = repo;
}
[HttpGet()]
public IActionResult Get()
{
//Do something cheap
if(something)
return Ok(something);
else
return Ok(repo.Value.Get());
}
}
Lazyでフェッチされるサービスは、目的のサービスタイプのnew Lazyでfactory registration methodによって再導入され、提供されますserviceProvider.GetRequiredServiceを使用した実装。
services.AddTransient<IRepo, Repo>()
.AddTransient(serviceProvider => new Lazy<IRepo>(() => serviceProvider.GetRequiredService<IRepo>()));