我们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 许可协议。转载请注明出处!