2017-02-20 11 views
-1

.NET MVCアプリケーションがあり、サービスをコントローラに渡す必要があります。コントローラはサービスを使用し、すべての計測器を取り出してビューに渡す必要があります。これを行うには、正しいアプローチは何ですか?.NET MVCフレームワークのコントローラにサービスを渡す

ここに私のコントローラ:

public class MyController: Controller 
    { 
     private MyService db; 

     public IActionResult Index() 
     { 
      var res = db.Instrument; 
      return View(res); 
     } 
    } 

私はdbを使用したいが、それは何らかの方法で渡される必要があります。 MyServiceサービス下:それはそれはその作業を行うために依存しているオブジェクトを作成する必要がないように

public class MyService : IMyService 
    { 
     private readonly IServiceProvider serviceProvider; 

     public MyService(IServiceProvider serviceProvider) 
     { 
      this.serviceProvider = serviceProvider; 
      Instrument = null; 
     } 

     public Instrument Instrument { get; private set; } 
    } 
+0

-1の理由は? –

+0

申し訳ありませんが、私はあなたの質問について理解していません。まず、コントローラ内のコードは、開始なしでdb変数を使用します。それはまったく意味がありません。私はインスタンスを自動的に作成したいと思う。それは...ですか? –

答えて

1

まず、私はコントローラを設定します(Inversion of Controlを参照してください)。サービスは、コントローラのコンストラクタを介して、コントローラはサービス・インターフェイスではなく、実際のサービス・タイプに応答することをコントローラに渡されること

public class MyController: Controller 
{ 
    private readonly IMyService myService; 

    public MyController(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    ... 
} 

は注意:

したがって、コントローラは、このように見えることができます。コントローラは、指定されたインタフェースに準拠しているだけで、サービスがどこから来たか、実装された方法に気を付ける必要はありません。

だから今、あなたはあなたの情報を取得するためにサービスを使用することができます。あなたが取得したいあなたはあなたの説明で指定され、私はすべての楽器を取得するために、あなたのサービスの実装を変更したことをここ

public class MyController: Controller 
{ 
    private readonly IMyService myService; 

    public MyController(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    public ViewResult Index() 
    { 
     var instruments = this.myService.GetInstruments(); 
     return View(instruments); 
    } 
} 

お知らせすべての楽器。

さらに、単純化のために、サービスから返された型をビューに直接渡したことに注目してください。しかし、私は通常、ビューモデルの使用をお勧めしますが、私はこれを読者の練習として残します。サービス自体については

、あなたが持っているかもしれません:

public class MyService : IMyService 
{ 
    private readonly IDataProvider dataProvider; 

    public MyService(IDataProvider dataProvider) 
    { 
     this.dataProvider = dataProvider; 
    } 

    public IEnumerable<Instrument> GetInstruments() 
    { 
     return dataProvider.GetInstruments(); 
    } 
} 

私はIServiceProviderがそのように私はIDataProviderに、この名前を変更したたのかわかりませんでした。サービス内のデータを取得するために必要なものは何でも構いません。たとえば、代わりにIDbContext(エンティティフレームワークを使用している場合)をコンストラクタに渡して、それを使用してデータを取得することができます。

非常にシンプルなビジネスユースケースのシナリオでアプリケーションが非常にシンプルな場合は、ここでこのサービスレイヤーが必要なく、データプロバイダーをコンストラクターに直接渡すこともできないことを指摘する必要があります。再び、私はこれを読者の練習として残します。最後に

、コンストラクタへIMyServiceの実装を渡すために、あなたがdependency injectionフレームワークを使用することができMyServiceIDataProviderの実装を渡します。

MVCがコントローラをインスタンス化するとき、依存性注入フレームワークを調べて、必要な依存関係を作成する方法を探します。この例では、Index()アクションが呼び出されると、MVCはMyServiceのインスタンスを作成しようとします。これは、依存性注入フレームワークにIMyServiceを実装するインスタンスを作成させます。依存性注入フレームワークはその設定を調べて、MyServiceのインスタンスを作成する必要があると判断しますが、この実装自体にはIDataProviderのインスタンスが必要です。したがって、依存性注入フレームワークは再びその設定を調べて、DataProviderのインスタンスを作成する必要があると判断します。 DataProviderのインスタンスをMyServiceに渡し、MyServiceのインスタンスをMyControllerに渡すと、MVCは最終的にIndex()アクションメソッドを呼び出し、アクションメソッドはサービスにアクセスします。

一般的な依存性注入フレームワークの一例はNinjectです。指定されたインタフェースに対して、これが必要なインスタンス型であることをフレームワークに伝えるためのルールを設定することができます。たとえば、次のように

this.Bind<IMyService>().To<MyService>(); 
this.Bind<IDataProvider>().To<DataProvider(); 

そして最後に、(あなたはかみそりのビューを使用していると仮定して)ビューの上部の宣言は次のように見えることがあります。私はこのことができます願っていますが、これがあるだけで

@model IEnumerable<Instrument> 

// You are now able to use @Model. in the view to provide you the information you require. 

をあなたの状況についての非常に簡単な紹介。したがって、さまざまなものがありますが、inversion of controldependency injectionおよびNinjectを潜在的な依存性注入フレームワークとして読むことをお勧めします。

関連する問題