C# ASP.NET Coreでコントローラーにサービスの依存関係を注入する方法
ASP.NET Coreでは、組み込みのIoC(Inversion of Control)コンテナを使用して、コンストラクタやメソッドを通じて依存クラスのオブジェクトを自動的に注入できます。
組み込みコンテナはIServiceProviderの実装として提供されており、デフォルトでコンストラクタインジェクションをサポートしています。また、このIoCコンテナによって管理される型(クラス)は「サービス」と呼ばれます。
IoCコンテナにアプリケーションのサービスを自動的に注入してもらうためには、まず対象となるサービスをコンテナに登録する必要があります。
サンプル:サービスの定義
まず、インターフェースとその実装クラスを用意します。
public interface ILog{
void info(string str);
}
class MyConsoleLogger : ILog{
public void info(string str){
Console.WriteLine(str);
}
}
ConfigureServicesメソッドでサービスを登録する
ASP.NET Coreでは、StartupクラスのConfigureServicesメソッド内で、アプリケーションサービスをIoCコンテナに登録します。ConfigureServicesメソッドはIServiceCollection型のパラメータを受け取り、これを使用してアプリケーションサービスを登録していきます。
以下のように、ConfigureServices()メソッド内でILogをIoCコンテナに登録しましょう。
public class Startup{
public void ConfigureServices(IServiceCollection services){
services.AddSingleton<ILog, MyConsoleLogger>();
}
}
登録の仕組み
IServiceCollectionインスタンスが持つAdd()系メソッドを使用することで、サービスをIoCコンテナに登録できます。
上記の例では、サービスタイプとしてILogを、その実装としてMyConsoleLoggerを指定しています。これにより、ILogサービスはシングルトン(Singleton)として登録されます。
登録後は、IoCコンテナがMyConsoleLoggerクラスのシングルトンオブジェクトを生成し、アプリケーション内のどこでILogをコンストラクタやメソッドのパラメータとして宣言していても、自動的にそのインスタンスを注入してくれます。
サービスのライフタイムの種類
IServiceCollectionには、ライフタイムの異なる複数の登録メソッドが用意されています。用途に応じて適切なものを選択しましょう。
- AddSingleton:アプリケーション全体で1つのインスタンスを共有します。
- AddScoped:HTTPリクエストごとに1つのインスタンスを作成します。
- AddTransient:サービスが要求されるたびに新しいインスタンスを作成します。
適切なライフタイムを選択することで、効率的かつ柔軟な依存性管理が可能になります。
-
C# ASP.NET Web APIでアクションメソッドにエイリアス名を設定する方法
アクションメソッドとはASP.NET Web APIでは、コントローラー内のpublicメソッドは「アクションメソッド」と呼ばれます。ここでは、ApiControllerクラスから派生したDemoControllerに、Get・Post・Put・DeleteといったHTTP動詞に対応する名前を持つ複数のアクションメソッドが定義されている例を考えてみましょう。基本的なアクションメソッドの定義例public class DemoController : ApiController{ public IHttpActionResult Get(){ // 何らかの処理
-
C# ASP.NET Web APIにおけるコントローラーアクションの4つの戻り値の型とは?
ASP.NET Web APIのアクションメソッドには、主に以下の4種類の戻り値の型を指定することができます。 void(戻り値なし) プリミティブ型/複合型 HttpResponseMessage IHttpActionResult 1. void(戻り値なし) すべてのアクションメソッドが必ずしも何かを返す必要はありません。戻り値の型としてvoidを指定することも可能です。 コード例 using DemoWebApplication.Models; using System.Web.Http; namespace DemoWebApplication.Controllers {