2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DI(Dependency Injection)のサンプル

Last updated at Posted at 2020-09-25

DI関連の記事をいくつか読んで、大体の使い方はわかったが、
自分で書かないと腑に落ちない部分もあったため、書いてみたサンプルです。
そのためDIの説明的なものは特に触れません。

以下コンストラクターインジェクションのサンプル
https://qiita.com/takmot/items/babc1590a3f9789553a4

ソースコード

ベースはdotnet new consoleで生成したプロジェクトになります。
以下のようにinterfacesフォルダにインターフェースクラスを定義したファイルを、
servicesフォルダにインターフェースを継承したサービスクラスを定義したファイルを作成しています。

├─interfaces
│  └──IMessageService.cs
└─services
│  └──MessageService.cs

└─application.cs
└─Program.cs

IMessageService.cs
namespace di_sample.IF
{
    public interface IMessageService
    {
        string Name { get; }
        string GetMessage();
    }
}

サービスは同じインターフェースを継承したものを2個作っています。
サービス区別用にプロパティにNameを持っています。

MessageService.cs
using di_sample.IF;
public class MessageServiceMorning : IMessageService
{
    public string Name { get; } = "Morning";
    private string message = "";
    public MessageServiceMorning()
    {
        message = "Good morning.";
    }
    public string GetMessage()
    {
        return message;
    }
}
public class MessageServiceAfternoon : IMessageService
{
    public string Name { get; } = "Afternoon";
    private string message = "";
    public MessageServiceAfternoon()
    {
        message = "Good afternoon.";
    }
    public string GetMessage()
    {
        return message;
    }
}

以下でDIコンテナを生成し、IMessageServiceインターフェースを持つクラス2つを登録します。

Program.cs
using System;
using Microsoft.Extensions.DependencyInjection;
using di_sample.APP;
using di_sample.IF;

namespace di_sample
{
    class Program
    {
        static void Main(string[] args)
        {

            var services = new ServiceCollection(); // DIコンテナ
            services.AddSingleton<IMessageService, MessageServiceAfternoon>();  // サービス登録
            services.AddSingleton<IMessageService, MessageServiceMorning>();    // サービス登録
            
            var app = new application(services);

            Console.ReadLine();
        }
    }
}

以下で、サービスの取り出し、サービスの区別、サービスの持つ関数コールを行います。

using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using di_sample.IF;

namespace di_sample.APP
{
    public class application
    {
        IEnumerable<IMessageService> Services;  // IMessageService型のサービスリスト
        public application(ServiceCollection services) {
            var provider = services.BuildServiceProvider();
            Services = provider.GetServices<IMessageService>(); // IMessageService型のサービスを取得

            writeMessage("Morning");
        }
        private void writeMessage(string name) {
            
            foreach(var service in Services) {
                if (service.Name == name) {        // プロパティでサービスを判定
                    Console.WriteLine(service.GetMessage());
                }
            }
        }
    }
}

ちなみに、サービス(MessageServiceMorning, MessageServiceAfternoon)のコンストラクタは、
サービスを取り出すタイミング(Services = provider.GetServices<IMessageService>();)でコールされます。

using Microsoft.Extensions.DependencyInjection;
にはパッケージの追加が必要です。
https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection

dotnet add package Microsoft.Extensions.DependencyInjection --version 3.1.8

コンストラクターインジェクションを使用したサンプルも書こうと思います。

参考記事

https://qiita.com/TsuyoshiUshio@github/items/20412b36fe63f05671c9
https://qiita.com/saeki4n/items/22a276dcac9ef537ee25

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?