2016-12-13 8 views
0

のインターフェイスの一般的な実装と特定の実装の両方を登録しました。Armen Shimoonの記事ASP.NET Core: Factory Pattern Dependency Injectionを読んで、彼が提案した手法を使用してASP.NET Core DIの問題を解決することに決めました。ASP.NETコアDI

public interface IItemRepository<out T> where T : BaseItem 

とその一般的な実装:

public class ItemRepository<T> : IItemRepository<T> where T : BaseItem 

私はそれを登録します。

services.AddSingleton(typeof(IItemRepository<>), typeof(ItemRepository<>)); 

しかし通貨のために、私が持っている 私は一般的なインタフェースを持っています具体的な実装:

10(CurencyはBaseItem型である。)私が欲しいものさ

CurrencyRepository 

実装する他のすべての項目について

IItemRepository<Currency> 

ItemRepository<T> 

に登録しますBaseItem。私はこれを達成するためのファクトリクラスを作成:

public class ItemRepositoryFactory : IServiceFactory> where T : BaseItem 
{ 
    private readonly ApplicationDbContext _context; 

    public ItemRepositoryFactory(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public ItemRepository Build() 
    { 
     if (typeof(T) == typeof(Currency)) 
      return new CurrencyRepository(_context) as ItemRepository; 

     return new ItemRepository(_context); 
    } 
} 

を私はIServiceCollectionに登録する方法がわかりません。あるいは、私はまったく正しい方法ではないでしょうか?

答えて

0

明示的に登録することはできません。 ASP.NET Core DIは、DI/IoCエクスペリエンスを簡単に提供し、他のDI/IoCコンテナに簡単にプラグインできるようにするためのものです。

組み込みのIoCでは、自動登録、アセンブリスキャン、デコレータ、またはクラスのすべてのインタフェース/サブタイプの登録はできません。具体的な実装について

は、クラスの同じインスタンスを受信するコンストラクタ内の「回避策」

services.AddScoped<IMyService,MyService>(); 
services.AddScoped<MyService>(provider => provider.GetService<IMyService>()); 
そして

両方MyServiceIMyServiceあります。

これはオープンジェネリックでは機能しませんが、manuellプロセスです。自動検出や登録のためにあなたはあなたのConfigureServicesメソッド内IItemRepository<Currency>を登録するのに十分でなければならないなどAutofac、のStructureMap

としてしかし、あなたの具体的なサンプル中のサードパーティIoCコンテナを、必要

services.AddScoped<IItemRepository<Currency>,CurrencyRepository>(); 

しかし、実際にはあなたのサービスにIItemRepository<Currency>を注入すると、オープンジェネリックはすでにこのケースをカバーしています。

+0

完全に動作します。ありがとうございますTseng –

関連する問題