晴耕雨読

working in the fields on fine days and reading books on rainy days

[C#] MS.DIコンテナでデリゲートを用いたサービス登録

MS.DI (Microsoft.Extensions.DependencyInjection) を使って依存を注入するときに、デリゲート (Delegate) を使うことでインスタンスの値を編集することができます。

以下のプログラムでは、ExampleService クラスが依存先である ExampleConfig クラス(設定値の情報を持つクラス)を参照するときに、ExampleConfig をデリゲートを使ってサービス登録する例です。

ExampleConfig.cs(設定値の情報を持つクラス):

namespace TestConsoleDelegate;
public class ExampleConfig
{
    public string ConfigPath { get; set; } = "";
}

IExampleService.cs(サービスのインターフェース):

namespace TestConsoleDelegate;
public interface IExampleService
{
    public string GetConfig();
}

ExampleService.cs(サービスの実装):

namespace TestConsoleDelegate;
public class ExampleService(ExampleConfig exampleConfig) : IExampleService
{
    public string GetConfig()
    {
        return exampleConfig.ConfigPath;
    }
}

Program.cs(プログラムのエントリーポイント):

using Microsoft.Extensions.DependencyInjection;
using TestConsoleDelegate;

// サービスの登録
var services = new ServiceCollection();
services.AddSingleton<ExampleConfig>(c => new ExampleConfig()
{
    ConfigPath = "/path/to/config"  // ここで設定値を修正できる
});
services.AddTransient<IExampleService, ExampleService>();

// DIコンテナの作成
IServiceProvider container = services.BuildServiceProvider();

// サービスの使用
var exampleService = container.GetRequiredService<IExampleService>();
Console.WriteLine(exampleService.GetConfig());

出力結果:

$ dotnet run
/path/to/config

AddSingleton で常に同じインスタンスを返すように設定し、そのデリゲーションの中でインスタンスのプロパティを修正することで、設定値を注入することができます。

以上です。