1. はじめに
- JavaでアノテーションをつけてDIするようにC#でも似たようなことをしたい
- DIすることで単体テストをモックを使用してできるようにしたい
- Microsoft製のDIコンテナ(Microsoft.Extensions.DependencyInjection)を使いたい
2. 開発環境
- Visual Studio 2022
- .NET6
- Microsoft.Extensions.DependencyInjection (NuGet)
- Windows11
3. Visual Studioで新規プロジェクトを作成する
4. Microsoft.Extensions.DependencyInjectionをインストールする
- ソリューションエクスプローラから「依存関係」を右クリックして、「NuGetパッケージの管理」を選択する
- 参照タブより「Microsoft.Extensions.DependencyInjection」をインストールする
5. インターフェースを追加する
- 新しい項目を追加で、「インターフェース」 を追加する
IMyService.cs
namespace DiConsoleApp
{
public interface IMyService
{
public void getValue();
}
}
5. クラスを追加する
- 新しい項目を追加で、「クラス」 を追加する
MyService.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DiConsoleApp
{
public class MyService : IMyService
{
public void getValue()
{
Debug.WriteLine("MyService コンストラクタ");
}
}
}
6. Program.csを修正する
Prcogram.cs
using DiConsoleApp;
using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics;
namespace DiConsoleApp
{
class Program
{
static void Main(string[] args)
{
// サービスコレクションを生成
var collection = new ServiceCollection();
// サービスコレクションにクラスと生成方法を登録
// AddSingleton(): 最初にサービスコンテナから要求されたタイミングでインスタンスを生成
// AddScoped(): クライアントから接続されたタイミングでインスタンスを生成
// AddTransient(): サービスコンテナから要求されたタイミングでインスタンスを生成
collection.AddTransient<IMyService, MyService>();
// サービスプロバイダから型(IMyService)に対応するインスタンスを取得
var provider = collection.BuildServiceProvider();
var myService = provider.GetRequiredService<IMyService>();
// メソッドを実行
myService.getValue();
}
}
}
7. 動作確認
- DIコンテナに登録したMyServiceのgetValue()が実行された
- サンプルにはないが、クラスAはコンストラクタでBを必要とするような場合でもServiceProviderが適切に処理してくれる
8. ソースコード
9. 参考文献