ASP.NET Core 簡単なDIを実装する

ASP.NET Core 簡単なDIを実装する

ASP.NET Coreで、簡単なDIを実装するまでの手順を記述してます。

環境

  • OS windows10 pro 64bit
  • VSCODE 1.56.2
  • .NET Core 3.1.409

Services作成

DIするインターフェイスをまずは作成します。
Servicesフォルダを作成して、以下の内容で「ITestService.cs」を作成します。

namespace Test.Services
{
    public interface ITestService{
        public string Hello();
    }
}

同様にインターフェイスを実装した「Services」配下に「TestService.cs」を作成します。

namespace Test.Services
{
    public class TestService : ITestService
    {
        private int i = 0;
        public string Hello(){
            i++;
            return i + "回実行されました";
        }

    }
}

Startup.cs編集

Startup.csの、DIの設定を行うConfigureServicesに以下を追加します。
※ここでは「DIされたら停止時まで、インスタンスが利用される(services.AddSingleton)」を使用してます。

// 追加
using Test.Services;

public void ConfigureServices(IServiceCollection services)
{
  // 追加
  services.AddSingleton<ITestService, TestService>();
    
}

Controller編集

適当なControllerに以下を追加して利用します。

using Test.Services; //追加

namespace Book.Controllers
{

  private ITestService testservice;

    [Route("api/[controller]")]
    [ApiController]
    public class BookController : ControllerBase
    {
        // 追加
        private ITestService testservice;

        // 追加
        public BookController(ITestService testservice)
        {
            this.testservice = testservice;
        }

    }
}

後は、以下のように適当なメソッド内で利用すれば、httpリクエストごとにHelloが実行され、カウントが増えていくと思います。

Console.WriteLine(testservice.Hello());

servicesを、AddSingletonではなく
「DIごとにインスタンスが生成される」AddTransientか、
「httpリクエストごとにインスタンスが生成される」AddScopedだと、
毎回インスタンスが生成されるので「i」の値は常に「1」となります。

services.AddTransient<ITestService, TestService>();
services.AddScoped<ITestService, TestService>();