コンソールアプリでASP.NET CoreのDIの仕組み(ServiceProvider)を使う(1)
2020/07/11追記
かずきさんのこちらの記事がとてもわかりやすい. qiita.com
AddScopedとAddTransientの違い
AddSingletonはSingleton. AddTransientはGetService
するたびにインスタンスが作られる. じゃあAddScopedはというと,スコープが異なると別のインスタンスが作られる.なるほどー.
DIコンテナによるコンストラクタインジェクションだけしか使っていなかったので,違いがわかっていなかった.
さらに詳しくはDeep dive.
Add...とTryAddがある
DIコンテナへの登録にはAdd...
とTryAdd...
がある(例えば,AddTransientとTryAddTransientなど).
TryAdd...の方は,同じものがすでに追加済みの場合は追加できない.迷ったらTryAdd...でもいいという.
なるほど!
他のDIコンテナと組み合わせても使える
そうなのか!
追記前の記事
Consoleアプリで,シンプルにASP.NET CoreのDIの仕組みを使いたいのであれば,Microsoft.Extensions.DependencyInjection
をインストールすればすぐに使うことができる.
using Microsoft.Extensions.DependencyInjection; using System; using System.Collections; using System.Collections.Generic; namespace consoletest { class Program { static void Main(string[] args) { var services = new ServiceCollection(); //登録 services.AddSingleton<IDataService, DataServiceMock>();//Singleton services.AddTransient<Printer>();//毎回インスタンス化 var serviceProvider = services.BuildServiceProvider(); //インスタンス取得 var printer = serviceProvider.GetService<Printer>(); printer.PrintOut(); } } public class Printer { private readonly IDataService _dataService; //登録済みのオブジェクトがDIされる public Printer(IDataService dataService) { this._dataService = dataService; } public void PrintOut() { var names = _dataService.MembersName(); foreach (var name in names) { Console.WriteLine(name); } } } public interface IDataService { IEnumerable<string> MembersName(); } public class DataServiceMock : IDataService { public IEnumerable<string> MembersName() { return new List<string> { "Taro Yamada", "Ichiro Suzuki", "Jotaro Higashikata" }; } } }
Printerクラスのインスタンス化の時点で,Printerクラスのコンストラクタ引数のIDataService
に予め登録しておいたDataServiceクラスのインスタンスがServiceProviderによって渡される.
出力: