> ## Content Index
> Fetch the complete content index at: https://blog.anthea.day/llms.txt
> Use this file to discover other available public pages before exploring further.

# 同一個介面多個實作的註冊
- URL: https://blog.anthea.day/multiple-implements-of-one-interface/
- Published: 2022-05-25T05:22:59.000Z
- Updated: 2026-10-21T03:46:50.000Z
- Author: Anthea / 芫荽
- Tags: #Migrated-1792241843742, #Import 2026-10-17 12:57, Coding, .NET

今天的重點是在於當我使用了同一個 Interface 的時候，要如何註冊並且分別取得多種實作的部分，因此不會著墨在 Interface 的原理和 DI 的介紹。

---

### .NET 和 Web API

假設今天有兩種傳送訊息的方式，一種是透過 slack，一種是透過 gmail，在同一個想要同時使用兩種發送方式的話，就會需要使用到 *同一個介面註冊多個實作* 的方法。

首先使用 `delegate` 註冊 Interface，並且告知對應的 key 輸入的時候要回傳哪一個 Service：

```C#
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddSingleton<GmailService>();
builder.Services.AddSingleton<SlackService>();
builder.Services.AddSingleton<MessageServiceResolver>(serviceProvider => key =>
{
    return key switch
    {
        "gmail" => serviceProvider.GetService<GmailService>(),
        "slack" => serviceProvider.GetService<SlackService>(),
    };
});

var app = builder.Build();
app.MapControllers();
app.Run();

public delegate IMessageService MessageServiceResolver(string key);
```

Interface 和 Service 的 code：

```C#
public interface IMessageService
{
    void Send();
}

public class SlackService : IMessageService
{
    public void Send()
    {
        Console.WriteLine("Send By Slack");
    }
}

public class GmailService : IMessageService
{
    public void Send()
    {
        Console.WriteLine("Send By Gmail");
    }
}
```

在 Controller 裡使用的時候分辨註冊 Interface，並調用 MessageServiceResolver 來分別取得實作：

```C#
using Microsoft.AspNetCore.Mvc;

namespace WebApplication1.Controllers;

[ApiController, Route("api/[controller]")]
public class TestController : ControllerBase
{
    private readonly IMessageService _gmail;
    private readonly IMessageService _slack;

    public TestController(MessageServiceResolver _service)
    {
        _slack = _service("slack");
        _gmail = _service("gmail");
    }
    
    public void Test()
    {
        _slack.Send();
        _gmail.Send();
    }
}
```

首先使用 `delegate` 註冊 Interface，並且告知對應的 key 輸入的時候要回傳哪一個 ServiceInterface 和 Service 的 code在 Controller 裡使用的時候分辨註冊 Interface，並調用 MessageServiceResolver 來分別取得實作

執行之後的結果如下：

![](https://cdn-images-1.medium.com/max/800/1*5tCDzTW7mxCc5GLiy39IKA.png)

---

> 參考資料  
> [How To Register Mmultiple Implementations Of The Same Interface In Asp Net Core](https://stackoverflow.com/questions/39174989/how-to-register-multiple-implementations-of-the-same-interface-in-asp-net-core?ref=blog.anthea.day)