ASP.NET Core MVC Dependency Injection ビューとコントローラ
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の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。
関連
-
.NET 6:.NETのロギングコンポーネントlog4netを使用する。
-
.NET Coreでオブジェクトプールを使用する
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
ASP.NET Core Web API チュートリアル プロジェクト構成図
-
NET 6 の今後の新機能 暗黙の名前空間参照
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
Net CoreによるAutoFacの利用
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
-
Application_End イベントをブロックする解決策
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NET6新機能 新構造体の最適化
-
NETガベージコレクション GC診断ツール dotnet-gcmon 使用方法
-
ASP.NET CoreでURLを設定する5つの方法
-
ネットのメモリ管理に関する5つの基本
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
ASP.NET Core MVC フィルタ
-
認証プロセスの記録にjwtを使用したネット
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
ネットパフォーマンスチューニング - ArrayPool 詳細
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現