这是委托最常用的用法

比如有这样一个需求,注册一个用户,然后需要发送邮件和短信通知

注册对象代码:

复制代码
 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服务中的东西.