shuhelohelo’s blog

Xamarin.Forms多めです.

コンソールアプリでASP.NET CoreのDIの仕組み(ServiceProvider)を使う(1)

2020/07/11追記

かずきさんのこちらの記事がとてもわかりやすい. qiita.com

AddScopedとAddTransientの違い

AddSingletonはSingleton. AddTransientはGetServiceするたびにインスタンスが作られる. じゃあAddScopedはというと,スコープが異なると別のインスタンスが作られる.なるほどー.

DIコンテナによるコンストラクタインジェクションだけしか使っていなかったので,違いがわかっていなかった.

さらに詳しくはDeep dive.

gist.github.com

Add...とTryAddがある

DIコンテナへの登録にはAdd...TryAdd...がある(例えば,AddTransientとTryAddTransientなど).

TryAdd...の方は,同じものがすでに追加済みの場合は追加できない.迷ったらTryAdd...でもいいという.

なるほど!

他のDIコンテナと組み合わせても使える

そうなのか!

qiita.com

追記前の記事

tech-blog.cloud-config.jp

tech.guitarrapc.com

shuhelohelo.hatenablog.com

andrewlock.net

Consoleアプリで,シンプルにASP.NET CoreのDIの仕組みを使いたいのであれば,Microsoft.Extensions.DependencyInjectionをインストールすればすぐに使うことができる.

f:id:shuhelohelo:20200629031040p:plain

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によって渡される.

出力:

f:id:shuhelohelo:20200629033131p:plain

ソースコード

github.com