7

一般的なレイジークラスを使用して、.netコア依存性注入拡張機能を持つ高価なクラスをインスタンス化しようとしています。私はIRepoタイプを登録しましたが、Lazyクラスの登録がどうなるか、サポートされているかどうかはわかりません。私はこの方法http://mark-dot-net.blogspot.com/2009/08/lazy-loading-of-dependencies-in-unity.html.netコア依存性インジェクションのサポートレイジー<T>

設定を使用している回避策として:

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()); 
    } 
} 
+2

"高価なクラスをインスタンス化する"。なぜそのクラスは費用がかかりますか?クラスは作成するのに費用がかかりません。彼らのコンストラクタは、[シンプル](http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)、速く[信頼できる](http://blog.ploeh.dk/2011/03/04/)でなければなりません。信憑性のある情報を含むオブジェクトを作成します。 – Steven

+2

いいえ(repository/context/...)クラスは、そのコンストラクタで接続を開く必要があります。 –

+0

私が制御できない手段は高価です。 – ATerry

答えて

11

ここではどのようなタイプを遅延解決できるようにLazy<T>の一般的な登録をサポートする別のアプローチがあります。

services.AddTransient(typeof(Lazy<>), typeof(Lazier<>)); 

internal class Lazier<T> : Lazy<T> where T : class 
{ 
    public Lazier(IServiceProvider provider) 
     : base(() => provider.GetRequiredService<T>()) 
    { 
    } 
} 
+0

レイジーは不必要に重いです、私はそれのより軽いバージョンをお勧めします。 –

3

あなただけ行う必要があるがLazy<IRepo>オブジェクトを作成するファクトリメソッドの登録を追加することです。

public void ConfigureService(IServiceCollection services) 
{ 
    services.AddTransient<IRepo, Repo>(); 
    services.AddTransient<Lazy<IRepo>>(provider => new Lazy<IRepo>(() => provider.GetService<IRepo>())); 
} 
+0

ありがとう、私は一般的な遅延登録があることを望んでいましたが、それは可能ではないようです。少なくともM $ DIではない。 – ATerry

+0

自分でジェネリックヘルパーメソッドを書くことができます。 – VMAtm

関連する問題