概要
- Microsoft.Extensions.DependencyInjection ServiceCollectionの機能の一つ
- 登録したクラスのコンストラクターにおけるDIを、別の登録したクラスによって自動解決
- クラスさえ登録しておけば、コンストラクターにおけるDIを意識せずにインスタンス化が可能
例
Program.cs
using Microsoft.Extensions.DependencyInjection;
namespace TestDI
{
internal class Program
{
public static void Main(string[] args)
{
// クラスの登録
var services = new ServiceCollection();
services.AddTransient<IMessenger, Messenger>();
services.AddTransient<ISplitter, Splitter>();
var provider = services.BuildServiceProvider();
// 登録したMessengerのインスタンスを取得する
// MessengerにDIされているISplitterは
// 登録済みのSplitterを使って自動的に解決される
var messenger = provider.GetRequiredService<IMessenger>();
messenger.SendMessage("Hello!");
}
}
}
IMessenger.cs
namespace TestDI
{
internal interface IMessenger
{
void SendMessage(string message);
}
}
Messenger.cs
using System;
namespace TestDI
{
internal class Messenger : IMessenger
{
private ISplitter splitter;
public Messenger(ISplitter splitter)
{
this.splitter = splitter; // このDIは自動的に行われる
}
public void SendMessage(string message)
{
Console.WriteLine(message);
this.splitter.SendSplitLine();
}
}
}
ISplitter.cs
namespace TestDI
{
internal interface ISplitter
{
void SendSplitLine();
}
}
Splitter.cs
using System;
namespace TestDI
{
internal class Splitter : ISplitter
{
public Splitter()
{
;
}
public void SendSplitLine()
{
Console.WriteLine("------------------------------");
}
}
}
所感
この機能を使用したコードを始めて見たときは少し混乱しました。
「あれ??どこでDIしてるの??」といった感じです。
一度分かってしまえば、とても便利に使えると思います。
複数のクラスにDIするときは特に。
参考にしたもの
公式ドキュメント:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1
分かりやすいまとめ記事:https://qiita.com/TsuyoshiUshio@github/items/20412b36fe63f05671c9