2017-11-04 12 views
0

Dotnetコア2.0に付属するIServiceCollectionを使用して簡単な依存性注入をセットアップしようとしています。Microsoft.Extensions.DependencyInjection nugetパッケージ。ServiceCollectionを使用したdotnet core 2.0コンソールアプリケーションの循環依存性

のSystem.InvalidOperationExceptionを::

public interface IService 
{ 
} 

public class JobService : IService 
{ 
    public IService m_service { get; set; } 
    public JobService(IService service) 
    { 
     m_service = service; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IServiceCollection serviceCollection = new ServiceCollection(); 
     ConfigureService(serviceCollection); 
     var serviceProvider = serviceCollection.BuildServiceProvider(); 
     //exception on next line 
     var service = serviceProvider.GetService<App>(); 
     Console.WriteLine("Hello World!"); 
    } 

    private static void ConfigureService(IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddTransient<IService, JobService>(); 
     serviceCollection.AddTransient<App>(); 
    } 
} 

上記の容器ではなく、実行時に、私が得るすべてのタイプを登録する必要があります:それはので、私は小さな実験を始めに、私は新しいです「循環依存関係'TestCore.IService'タイプのサービスで検出されました。 '

私の実装には循環依存性はありません。誰かがこの循環依存がどこから来るかを指摘できますか?サービスとしては、それは、このアプリケーションクラスに注入されなければならない

私が作っ:

public class App 
{ 
    private IService m_service; 
    public App(IService service) 
    { 
     m_service = service; 
    } 
} 

答えて

3

依存性注入フレームワークは、循環依存が原因IServiceのための依存関係を解決することができません。 IServiceJobService)の実装自体がIService(つまりそれ自体)の実装に依存していることが原因です。 JobService自体が依存しているため、JobServiceをインスタンス化することはできません。 DIフレームワークはこれを認識し、あなたが見ている例外をスローします。 /別に

public interface IService 
{ 
} 

public interface IAnotherService 
{ 
} 

public class JobService : IService 
{ 
    public IAnotherService m_service { get; set; } 
    public JobService(IAnotherService service) 
    { 
     m_service = service; 
    } 
} 

public class AnotherService : IAnotherService 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IServiceCollection serviceCollection = new ServiceCollection(); 
     ConfigureService(serviceCollection); 
     var serviceProvider = serviceCollection.BuildServiceProvider(); 
     //exception on next line 
     var service = serviceProvider.GetService<App>(); 
     Console.WriteLine("Hello World!"); 
    } 

    private static void ConfigureService(IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddTransient<IAnotherService, AnotherService>(); 
     serviceCollection.AddTransient<IService, JobService>(); 
     serviceCollection.AddTransient<App>(); 
    } 
} 

編集:これを回避するためには、異なるインタフェースの実装にJobServiceを依存させる必要があるでしょう あなたがAutofacを使用していた場合は、JobServiceIService依存関係を維持し使用しますが、提供することができます異なる実装はNamed and Keyed Servicesを使用します。

+0

いいえ、それは問題ではありません。 OPのIServiceとJobServiceのコードはそのままコンパイルされます。 – Enigmativity

+0

OPが取得しているのはコンパイルエラーではありません。試してみてください。実行時にエラーが発生します。 – CalC

+0

DIは 'JobService'を' JobService'のコンストラクタに挿入しようとしていますか? – Enigmativity