1. ホーム
  2. Web プログラミング
  3. ASP.NET

ASP.NET Core MVC Dependency Injection ビューとコントローラ

2022-01-14 05:51:51

I. ASP.NET Core MVC Dependency Injection ビュー

{{コード 試行における依存性注入の使用をサポートします。これは、ローカライゼーションやビュー要素へのデータ投入にのみ使用されるデータなど、 ビュー特有のサービスを提供するのに役立ちます。コントローラとビューの間の関心事の分離は、可能な限り維持されるべきです。ビューで表示されるデータのほとんどは、コントローラから渡される必要があります。

  を使用しています。 ASP.NET Core ディレクティブを使用して、 ビューにサービスを注入するための構文です。 @inject は、その

例えば

@inject   

  を前置する必要があります。 @model MVCTest.Models. @using MVCTest.Services @inject BaseInfoServices BaseInfoServices @{ ViewData["Title"] = "Create"; } <ul> @foreach (var city in BaseInfoServices.GetCities()) { <li>@city</li> } </ul> public class BaseInfoServices { public List<string> GetCities() { return new List<string>(); } } をクリックして、コンテナにサービスを追加してください。

 1. ルックアップデータを入力する

  ビューインジェクションは、ドロップダウンリストなどのUI要素に情報を入力するのに役立ちます。例えば、性別や州などのユーザー情報を含むフォームがあるとします。このフォームを標準的な MVC アプローチでレンダリングする場合、コントローラはオプションの各セットに対してデータアクセスサービスを要求し、バインドされたオプションの各セットをモデルまたは {コード での

  もう一つは、このオプションデータを取得するためのサービスを直接ビューに注入することです。この方法では、コントローラのコード量を最小限に抑え、ビュー要素を構築するロジックをビュー自体に移動させます。コントローラ {{コード ユーザープロファイルデータをフォームに渡すだけです。

2. サービスを書き換える

  このテクニックは,サービスを注入するだけでなく,以前に注入されたサービスをページ上で書き換えるために使用することもできます.たとえば、デフォルトの ConfigureServices

{{コード

  を使用したビューで ViewBag はカスタムサービスを呼び出します。

  既存のサービスを置き換えるのではなく、拡張したい場合は、このテクニックを使いながら、サービスに既存の実装を継承させるか、カプセル化させるだけでよい。

II. ASP.NET Core MVC ディペンデンシーインジェクションコントローラ

Action コントローラは、コンストラクタで明示的に依存関係を要求する必要があります。場合によっては、ひとつのコントローラ操作にひとつのサービスが必要になることもあり、 コントローラレベルでの要求が意味をなさないこともあります。この場合、サービスをActionのパラメータとして含めることも可能です。

  依存性注入は、以下のような方法です。 {{コード であり、アプリケーションを疎結合のモジュールで構成することを可能にする。

1. コンストラクタ注入

HTML Helper @model MVCTest.Models. @using MVCTest.Services @inject BaseInfoServices BaseInfoServices @inject MyHtmlHelper Html 組み込みのコンストラクタによる依存性注入のサポートは、MVC コントローラにも拡張されています。サービスタイプのみをコンストラクタのパラメータとしてコントローラに追加することで @Html は、組み込みのサービスコンテナを使用してこのタイプを解決しようとします。サービスは通常、インターフェイスを使用して定義されます(ただし、必ずしもそうとは限りません)。例えば、アプリケーションが時刻を取得するサービスを定義し、 ハードコーディングではなくインジェクションに依存する場合です。

インターフェースと実装を定義する。

ASP.NET Core MVC 

で {コード でコンテナにサービスを登録します。

Dependency Inversion Principle 

使用するコントロールで

 ASP.NET Core 

ASP.NET Core 組み込みの依存性注入は、要求されたサービスのタイプに対して 1 つのコンストラクタのみをサポートし、2 つを超えると例外が発生します。デフォルトの依存性注入をサードパーティの実装に置き換えることで、複数のコンストラクタをサポートすることができます。

2. FromServicesオペレーションを利用して

  複数の操作に対して、コントローラでサービスを提供する必要がない場合もあります。この場合、オペレーションメソッドのパラメータにサービスを注入することが理にかなっています。これを実現するのが namespace MVCTest.Services services public interface IDateTime Now { get; } DateTime Now { get; } } public class SystemDateTime: IDateTime { public DateTime Now Now { get { return get { return DateTime.Now; } } } } タグのパラメータに

ConfigureServices 

 3. コントローラの設定にアクセスする

  コントローラ内のアプリケーション設定やコンフィギュレーション設定にアクセスする際によくあるパターンです。このアクセスは services.AddTransient<IDateTime, SystemDateTime>(); アクセスパターンに記載されています。通常、依存性注入を使用してコントローラから直接設定を要求するべきではありません。 public class DateTimeController : Controller { private IDateTime _dateTime; public DateTimeController(IDateTime dateTime) { _dateTime = dateTime; } // GET: DateTime public ActionResult Index() { var serverTime = _dateTime.Now; if (serverTime.Hour < 12) { ViewData["Message"] = "Good Morning"; } return View(); } } のインスタンスを作成します。ここで、T は必要な設定の種類です。例えば

オプションクラスを作成します。

ASP.NET Core 

appsettings.json。

[FromServices] 

でオプションモデルを使用するようにアプリケーションを設定します。 public ActionResult Index([FromServices] IDateTime _dateTime) { var serverTime = _dateTime.Now; if (serverTime.Hour < 12) { ViewData["Message"] = "Good Morning"; } return View(); } でサービスコンテナに設定クラスを追加します.

Configuration 

の例です。 IOptions をクリックすると設定が読めますが、コードで設定を追加することも可能です。

  please型の設定オブジェクトが指定されると public class AppSettingOptions { public DefaultConnec ConnectionStrings { get; set; } public string AllowedHosts { get; set; } } public class DefaultConnec { public string DefaultConnection { get; set; } } を作成し、サービスコンテナに追加すると コントローラやアクションメソッドに IO { "ConnectionStrings": { "DefaultConnection": "Data Source=. ;Initial Catalog=Test;Integrated Security=True" }, "Logging": { "LogLevel": { "Default": "Information" } }, "AllowedHosts": "*" }   インスタンスで取得することができます。

ConfigureServices 

  follow optionパターンは、設定と構成を互いに分離することができ、設定情報をどこでどのように見つけるかを知る必要がないため、コントローラは関心事の分離に従うことを保証します。コントローラクラスで設定クラスを静的にアタッチしたり直接インスタンス化することがないため、コントローラのユニットテストを使用することが容易になります。

この時点では、この {{コード 依存性注入ビューで public Startup(IConfiguration configuration,IHostingEnvironment env) { //Configuration = configuration; var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json",optional:true,reloadOnChange:true) //.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true) ; //configure environment variables //builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services) { services.AddOptions(); services.Configure<AppSettingOptions>(Configuration); //Written by code services.Configure<AppSettingOptions>(options=> { options.AllowedHosts = "test"; }); } この記事はここまでです。 appsettings.json 依存性注入の内容については、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。