クラウド対応構成
ASP.NET 5では、設定値に対してweb.configファイルを使用しなくてもよくしています。簡単に、クラウドにアプリを展開し、アプリが自動的に環境に合った設定値を読み取るようにしたいと思っていました。新システムでは、さまざまなソース(JSON、XML、環境変数など)から名前付きの値を要求できるようになっています。ソリューションに最適のフォーマットを選択できます。
Startup.csファイルでは、設定値に対するソースの追加または削除ができます。
上記のコードは、JSONファイルや環境変数から設定値を取得するように設定されたプロジェクトを示しています。他のソースを指定する必要がある場合はこのコードは変更できます。指定したconfig.jsonファイルで値を提供できます。
Azureのようなホスト環境では、環境変数を設定して、アプリケーションが展開された後にローカル設定値の代わりにこれらの値が自動的に使用されます。テスト値が発行されるという心配をすることなく、アプリケーションを展開できます。
依存性注入(DI)
依存性注入(DI)は、MVC、Web API、SignalRなどの既存のASP.NETフレームワークでサポートされていますが、一貫性のある総合的な方法ではありません。ASP.NET 5は、Webスタックすべてに渡り一貫性のある方法で使用できるビルトインDI抽象化を提供します。サービスには、ミドルウェア、フィルター、コントローラ、モデルバインディングなど、実質的にサービスを使用するパイプラインのどの部分でも、起動時にアクセスできます。ASP.NET 5には、システムをブートストラップする最小限のDIコンテナが含まれていますが、選択したコンテナ(Autofac、Ninjectなど)を簡単にデフォルトのコンテナと置き換えられます。サービスはSingletonでスコープは要求または一過性になります。
例えば、ASP.NET MVC 6でコンストラクタインジェクションの使用方法を確認するために、新しいASP.NET 5スターターWebプロジェクトを作成し、シンプルなタイムサービスを追加してみます。
using System; namespace WebApplication1 { public class TimeService { public TimeService() { Ticks = DateTime.Now.Ticks.ToString(); } public String Ticks { get; set; } } }
コンストラクタが呼び出されたときに、単純なサービスクラスは現在のTicksを設定します。
次に、StartupクラスのConfigureServicesメソッドで一過性のサービスとしてTimeServiceを登録します。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddTransient<TimeService>(); }
その後、TimeServiceオブジェクトが作成されたときに、コンストラクタインジェクションを使用してTicksを書くようにHomeControllerを更新します。
public class HomeController : Controller { public TimeService TimeService { get; set; } public HomeController(TimeService timeService) { TimeService = timeService; } public IActionResult About() { ViewBag.Message = TimeService.Ticks + " From Controller"; System.Threading.Thread.Sleep(1); return View(); } // Code removed for brevity }
見ていただくと、コントローラはTimeServiceを作成していません。コントローラがインスタンス化されるときに注入されています。
MVC 6では、プロパティ経由でサービスを注入するのに[Activate]属性が使用できます。[Activate]は、コントローラ上だけでなく、フィルタ、ビューコンポーネント上でも使用できます。つまり、コントローラコードを以下のように簡素化できるということです。
public class HomeController : Controller { [Activate] public TimeService TimeService { get; set; } // Code removed for brevity }
MVC 6は@Injectキーワードを通じてRazorビューでのDIもサポートしています。以下のコードでは、直接AboutビューにTimeServiceを注入し、アクセス可能なTimeSvcプロパティを定義しています。
@using WebApplication23 @inject TimeService TimeSvc <h3>@ViewBag.Message</h3> <h3> @TimeSvc.Ticks From Razor </h3>
アプリを実行すると、コントローラとビューで異なるTickの値が確認できます。