编辑
2025-09-24
C#
00

目录

摘要
正文
使用场景

摘要

我们C#做一个功能如下的项目,包括如下基本功能:

配制服务

日志服务

邮件发送服务

正文

新建三个服务Class Library

ConfigServices:配制服务

LogServices:日志服务

EmailServices:邮件发送服务


ConfigServices

C#
namespace ConfigServices { public interface IConfig { string Value(string key); } }
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConfigServices { public class ConfigProvider : IConfig { public string Value(string key) { return Environment.GetEnvironmentVariable(key); } } }

LogServices

C#
namespace LogServices { public interface ILog { void Error(string message); void Info(string message); } }
C#
namespace LogServices { public class LogProvider : ILog { public void Error(string message) { Console.WriteLine($"出现错误:{message}"); } public void Info(string message) { Console.WriteLine($"信息:{message}"); } } }

EmailServices

C#
namespace EmailServices { public interface IEmail { public void SendEmail(string subject, string body,string to); } }
C#
using ConfigServices; using LogServices; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EmailServices { public class EmailProvider : IEmail { public readonly ILog log=null; public readonly IConfig config = null; public EmailProvider(ILog log, IConfig config) { this.log = log; this.config = config; } public void SendEmail(string subject, string body, string to) { this.log.Info("发邮件开始"); string smtpServer= this.config.Value("SmtpServer"); string userName = this.config.Value("UserName"); string password = this.config.Value("Password"); Console.WriteLine($"{smtpServer}-{userName}-{password}"); Console.WriteLine($"发送邮件:{subject},{body},{to}"); this.log.Info("发邮件完成"); } } }

Console调用

C#
using ConfigServices; using EmailServices; using LogServices; using Microsoft.Extensions.DependencyInjection; namespace ioc_2 { internal class Program { static void Main(string[] args) { ServiceCollection services=new ServiceCollection(); services.AddScoped<IConfig,ConfigProvider>(); services.AddScoped<ILog, LogProvider>(); services.AddScoped<IEmail,EmailProvider>(); using (var sp = services.BuildServiceProvider()) { var provider = sp.GetRequiredService<IEmail>(); provider.SendEmail("test", "body", "admin@admin.com"); } } } }

这里注意一下,GetRequiredService,取得服务。

在 C# 中,GetRequiredService 是一个扩展方法,它属于 Microsoft.Extensions.DependencyInjection 命名空间。这个方法用于从依赖注入(DI)容器中获取服务的实例。GetRequiredService 方法与 GetService 方法类似,但它们之间有一个重要的区别:当请求的服务未在 DI 容器中注册时,GetRequiredService 会抛出一个异常,而 GetService 会返回 null

这使得 GetRequiredService 成为一个更加严格的方法,它确保了服务的存在,从而避免了在应用程序中处理 null 的复杂性。这在你确信服务一定会被注册的情况下非常有用。

使用场景

GetRequiredService 通常在你确信请求的服务已经在依赖注入容器中注册,并且应用程序的正常运行依赖于这个服务的存在时使用。如果服务没有注册,程序会抛出异常,这有助于快速发现配置错误或其他问题。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!