2016-08-22 13 views
2

多くのMVCの例では、StartupクラスのConfigurationServicesメソッドでインターフェイスを登録する方法を参照してください。これは、あなたのコードがすべてMVCアプリケーション内に書かれているときには問題ありませんが、 'Real World'では必ずしもそうではありません。DI in .Net Core MVC 1.0

私は、フォーム

public class MyService : IMyService 
{ 
    private readonly IMyRepository _myRepository; 
    public MyService(IMyRepository myRepository) 
    { 
     _myRepository = myRepository; 
    } 
    ....... 

でクラスライブラリプロジェクトは、今私のコントローラで、私は、フォームのコンストラクタを持っています:

public HomeController(IConfigurationRoot config, IMyServcie myService) 
{ 
    ...... 

問題はMyServiceインタフェースが登録されていない、ありますDIコンテナと一緒に私は実際に他の層のservices.AddScoped<interface,class>()行のコードをロードしてConfigurationServicesメソッドを膨らませたくありません。

他のレイヤー(リポジトリとサービス)で最初に登録する必要があります(どちらも.NET Coreクラスライブラリプロジェクトです)。次にそれらのコンテナを親コンテナに配線しますか?

+2

を呼び出す必要があります。あなたが話している膨らみはどこかにあるだろう。 – Shyju

+0

はい、私は知っていますが、自分のリポジトリレイヤで定義されたインターフェイスをリポジトリレイヤコンテナに登録したいと考えています。次に、サービスレイヤコンテナに自分のサービスレイヤで定義されたインターフェイスを登録し、そのサービスレイヤコンテナの拡張としてリポジトリコンテナを追加し、最後にサービスレイヤコンテナをMVCプロジェクトの構成サービスに登録します。私はUnityを使ってこれを行う方法を知っていましたが、コア1.0と組み込みのDiコンテナでは、これを行う方法はわかりません。 – bilpor

+0

'ConfigurationServices'はコンポジションルートなので、サービスを登録します。鼓動はどこかに行かなければならない。他のレイヤーとターゲット 'ServiceCollection'に拡張メソッドを作成し、必要に応じて追加することができます。彼らは技術的にそこに最初に登録されていません。 'ServiceColection'に対して拡張メソッドを適用すると、それらはコンポジションルートに登録されます。 – Nkosi

答えて

5

ConfigurationServicesはあなたの構成ルートですので、サービスを登録します。鼓動はどこかに行かなければならない。他のレイヤーとターゲットに拡張メソッドを作成して、IServiceCollectionを作成し、必要に応じて追加することができます。彼らは技術的にそこに最初に登録されていません。拡張メソッドを適用するときにコンポジションルートに登録されますIServiceColection

IServiceCollectionインターフェイスにアクセスするには、他のレイヤーがMicrosoft.Extensions.DependencyInjection.Abstractionsを参照する必要があります。

IMOこれらの拡張メソッドはサービスレイヤまたはリポジトリレイヤにある必要はありません。これらのレイヤーは、それらがどのように構成されているかについて何も知る必要はありません。あなたは、別のクラスのコンポジションルートにそれらを簡単に配置し、スタートアップクラスをよりクリーンにすることが最終目標であれば、上のように呼び出すことができます。または、特に.netコアのDIフレームワークを対象とした個別の拡張プロジェクトを作成します。

サービス拡張レイヤ

public static IServiceCollection AddMyServices(this IServiceCollection services) { 
    services.AddScoped<IMyService, MyService>(); 
    //...add other services 
} 

リポジトリ拡張レイヤ

public static IServiceCollection AddMyRepositories(this IServiceCollection services) { 
    services.AddScoped<IMyRepository, MyRepository >(); 
    //...add other services 
} 

そしてコンポジションのルートでConfigureServices

public void ConfigureServices(IServiceCollection services) { 
    //...other code 

    services 
     .AddMyServices() 
     .AddMyRepositories(); 

    //...other code 
} 

UPDATE コメントをもとに、あなたが同じように簡単に呼び出すことができますメインプロジェクト自体

public static IServiceCollection AddMyServices(this IServiceCollection services) { 
    services.AddMyRepositories(); 
    services.AddScoped<IMyService, MyService>(); 
    //...add other services 
} 

とは対照的に、AddMyServies拡張メソッドで210そしてコンポジションのルートで、ConfigureServicesはあなたがどこかにそれを登録する必要がAddMyServices

public void ConfigureServices(IServiceCollection services) { 
    //...other code 

    services.AddMyServices(); 

    //...other code 
} 
+0

この詳細な回答は@Nkosiに感謝します。私はもしかすることができれば、もう一つの質問があります。どこに '.AddMyRepositories();'を登録しますか?メインプロジェクト自体とは対照的に、これをサービスレイヤーに登録することは可能ですか? – bilpor

+0

はい、これは拡張メソッドであり、あなたのサービスレイヤがリポジトリインタフェースを参照しているので、 'AddMyServies'拡張メソッドの' services.AddMyRepositories() 'も簡単に呼び出すことができます – Nkosi

関連する問題