这是委托最常用的用法
比如有这样一个需求,注册一个用户,然后需要发送邮件和短信通知
注册对象代码:
1 /// <summary> 2 /// 注册数组传输对象. 3 /// Data Transfer Object 4 /// </summary> 5 public class RegisteDto 6 { 7 /// <summary> 8 /// 用户名. 9 /// </summary> 10 public string Account { get; set; } 11 12 /// <summary> 13 /// 密码. 14 /// </summary> 15 public string Password { get; set; } 16 17 /// <summary> 18 /// 邮箱. 19 /// </summary> 20 public string Email { get; set; } 21 22 /// <summary> 23 /// 电话号码. 24 /// </summary> 25 public string PhoneNumber { get; set; } 26 }
有三个服务,分别实现短信发送,邮件发送和注册
1 /// <summary> 2 /// 邮件服务. 3 /// </summary> 4 public class MailService 5 { 6 public void SendMail(string email) 7 { 8 Console.WriteLine($"向 {email} 发送邮件"); 9 } 10 }
1 /// <summary> 2 /// 短信服务. 3 /// </summary> 4 public class SmsService 5 { 6 public void SendSms(string phoneNumber) 7 { 8 Console.WriteLine($"向 {phoneNumber} 发送短信"); 9 } 10 }
1 public class AccountService 2 { 3 4 public void Registe(RegisteDto registe, Action Notice = null) 5 { 6 Console.WriteLine($"注册用户:{registe.Account}"); 7 Console.WriteLine($"密码:{registe.Password}"); 8 Console.WriteLine($"Email:{registe.Email}"); 9 Console.WriteLine($"电话号码:{registe.PhoneNumber}"); 10 // 注册完成,执行回调. 11 Notice?.Invoke(); 12 } 13 }
controller代码:
/// <summary> /// 比如有这么一个controller /// /// </summary> public class CallbackController { // 邮件服务. private readonly MailService _mailService; // 短信服务. private readonly SmsService _smsService; // 用户服务. private readonly AccountService _accountService; public CallbackController(MailService mailService, SmsService smsService, AccountService accountService ) { _mailService = mailService; _smsService = smsService; _accountService = accountService; } /// <summary> /// 假如有一个注册函数. /// </summary> /// <param name="registeDto"></param> public void Registe(RegisteDto registeDto) { // 在外部声明要执行的回调. _accountService.Registe(registeDto, () => { // 如果注册的邮箱不为空,则发送邮件. if (!string.IsNullOrEmpty(registeDto.Email)) { _mailService.SendMail(registeDto.Email); } // 如果电话不为空则发送短信. if (!string.IsNullOrEmpty(registeDto.PhoneNumber)) { _smsService.SendSms(registeDto.PhoneNumber); } }); } }
通过回调实现不在accout服务中的东西.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器