下面给你一份 最新、最清晰、可直接用于写技术文章或教程的《.NET Core 项目中自定义服务的实现步骤》
内容包括:基础步骤 + 代码示例 + 推荐最佳实践


✅ 一、什么是自定义服务?

在 .NET Core 中,所有业务逻辑都应该通过 依赖注入(DI) 的方式管理。
自定义服务就是你写的类(业务逻辑类),通过 DI 注册给框架,然后在控制器等地方使用。


✅ 二、自定义服务的完整实现步骤(5 步)


步骤 1:创建服务接口(I 接口层)

📌 建议放到 /Services 文件夹中。

public interface IEmailService
{
    void Send(string to, string subject, string content);
}


步骤 2:创建服务实现类

public class EmailService : IEmailService
{
    public void Send(string to, string subject, string content)
    {
        Console.WriteLine($"Send email to {to}, subject={subject}");
    }
}


步骤 3:在 Program.cs 注册服务(DI 容器)

.NET 6 / 7 / 8 的风格:

builder.Services.AddScoped<IEmailService, EmailService>();

📌 可选:注册方式对照

方法作用范围
AddSingleton应用运行期间只创建一次实例
AddScoped每个 HTTP 请求创建一次实例(Web 项目最常用)
AddTransient每次注入都创建新实例

步骤 4:在 Controller 或其他服务中注入使用

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    private readonly IEmailService _emailService;

    public TestController(IEmailService emailService)
    {
        _emailService = emailService;
    }

    [HttpGet("send")]
    public IActionResult SendTest()
    {
        _emailService.Send("abc@test.com", "Hello", "This is test");
        return Ok("Email Sent");
    }
}


步骤 5:运行项目验证 DI 是否生效

访问:

GET /test/send

控制台应输出:

Send email to abc@test.com, subject=Hello

DI 成功。


✅ 三、可选进阶:使用 Keyed Services(.NET 8 新特性)

假设你有两个邮件服务:

builder.Services.AddKeyedScoped<IEmailService, EmailService>("normal");
builder.Services.AddKeyedScoped<IEmailService, PremiumEmailService>("vip");

使用方式:

public class TestController : ControllerBase
{
    private readonly IEmailService _emailService;

    public TestController([FromKeyedServices("vip")] IEmailService emailService)
    {
        _emailService = emailService;
    }
}

👉 可以用于多租户、策略、不同业务分组,非常强大。


✅ 四、最佳实践总结(适合放文章结尾)

  1. 业务逻辑全部封装到服务中(Controller 保持精简)
  2. 服务必须使用 接口 + 实现类 设计(便于测试和替换)
  3. 根据生命周期选择注册方式(Scoped 最常用)
  4. .NET 8 项目推荐使用 Keyed Services 优化多实例场景
  5. 避免服务中注入太多依赖,建议拆分业务(SRP 原则)