まず、私はコントローラを設定します(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フレームワークを使用することができMyService
へIDataProvider
の実装を渡します。
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 control、dependency injectionおよびNinjectを潜在的な依存性注入フレームワークとして読むことをお勧めします。
-1の理由は? –
申し訳ありませんが、私はあなたの質問について理解していません。まず、コントローラ内のコードは、開始なしでdb変数を使用します。それはまったく意味がありません。私はインスタンスを自動的に作成したいと思う。それは...ですか? –