• ASP.NET Boilerplate 邮件类使用


    在系统我们自定一个 MySettingProvider,并添加到配置集合中,定义一些邮件参数覆盖默认参数,然后通过IOC容器得到SmtpEmailSender实例,调用send方法就实现了,实现代码如下:

    1.自定义配置类

    public class MySettingProvider : SettingProvider
    {
        public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
        {
            return new[]
            {
                new SettingDefinition(EmailSettingNames.Smtp.Host, "smtp.qq.com"),
                new SettingDefinition(EmailSettingNames.Smtp.Port,"25"), 
                new SettingDefinition(EmailSettingNames.DefaultFromAddress,"834663884@qq.com"), 
                new SettingDefinition(EmailSettingNames.Smtp.UserName,"834663884@qq.com"), 
                new SettingDefinition(EmailSettingNames.Smtp.Password,""),  
                new SettingDefinition(EmailSettingNames.Smtp.UseDefaultCredentials,"false"), 
                new SettingDefinition(EmailSettingNames.DefaultFromDisplayName,"shuangjie"), 
    
                new SettingDefinition(
                           AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin,
                           "true",
                           new FixedLocalizableString("Is email confirmation required for login."),
                           scopes: SettingScopes.Application | SettingScopes.Tenant
                           )
            };
        }
      }
    

    2.添加到配置集合,加到模块初始化类里就行

    Configuration.Settings.Providers.Add<MySettingProvider>();
    

    3.使用SmtpEmailSender

    var emailSender = IocManager.Instance.Resolve<ISmtpEmailSender>();
    emailSender.Send(message.Destination, message.Subject, message.Body);
    

    4.下面将框架是如何实现这些操作的

    在SmtpEmailSender的构造函数中注入了ISmtpEmailSenderConfiguration,它的实现类是SmtpEmailSenderConfiguration,通过他我们的Send方法得到我们需要的邮箱配置,那让我们看究竟做了什么

    public class SmtpEmailSenderConfiguration : EmailSenderConfiguration, ISmtpEmailSenderConfiguration, ITransientDependency
    {        
        public string Host
        {
            get { return GetNotEmptySettingValue(EmailSettingNames.Smtp.Host); }
        }
    
        public int Port
        {
            get { return SettingManager.GetSettingValue<int>(EmailSettingNames.Smtp.Port); }
        }
        ....
    

    他通过SettingManager的GetSettingValue方法来得到一些配置的值,SettingManager字段,GetNotEmptySettingValue方法来自EmailSenderConfiguration,这里就不粘它的代码了,GetNotEmptySettingValue也是通过SettingManager.GetSettingValue的方式来获得配置数据的,GetSettingValue是SettingManager的扩展方法,接下来就让我看看SettingManager类

    public class SettingManager : ISettingManager, ISingletonDependency
    {
    
        public Task<string> GetSettingValueAsync(string name)
        {
            return GetSettingValueInternalAsync(name, AbpSession.TenantId, AbpSession.UserId);
        }
    
        private async Task<string> GetSettingValueInternalAsync(string name, int? tenantId = null, long? userId = null)
        {
            var settingDefinition = _settingDefinitionManager.GetSettingDefinition(name);
    
            //Get for user if defined
            if (settingDefinition.Scopes.HasFlag(SettingScopes.User) && userId.HasValue)
            {
    

    SettingScope是枚举,有三个值分别是Application、TenantId、UserId,在这里不讲,通过代码们看到获取配置的方法是_settingDefinitionManager的GetSettingDefinition,返回结果是SettingDefinition,这个类主要用来保存Name、Value等等属性,我们要看的是GetSettingDefinition方法,代码如下

    internal class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency
    {
        public void Initialize()
        {
            var context = new SettingDefinitionProviderContext();
    
            foreach (var providerType in _settingsConfiguration.Providers)
            {
                var provider = CreateProvider(providerType);
                foreach (var settings in provider.GetSettingDefinitions(context))
                {
                    _settings[settings.Name] = settings;
                }
            }
        }
    
        public SettingDefinition GetSettingDefinition(string name)
        {
            SettingDefinition settingDefinition;
            if (!_settings.TryGetValue(name, out settingDefinition))
            {
                throw new AbpException("There is no setting defined with name: " + name);
            }
    
            return settingDefinition;
        }
    

    通过代码我们看到SettingDefinition来自Provider,也就是我们自定义或默认已有的SettingProvider类,这个类有个方法GetSettingDefinitions,通过它来得到我们的配置,SettingDefinitionManager的Initialize会在程序启动时被调用,详看AbpKernelModule,这个初始化方法就得到了所有的SettingDefinition,这就是大概流程,因为在AbpKernelModule添加的的SettingProvider会早于我们自定义的SettingProvider,所以我们的会覆盖默认的。

    到此结束!

  • 相关阅读:
    springboot中多线程中使用MultipartFile进行异步操作报错,系统找不到指定的文件
    使用 IntraWeb (45) 活用 IntraWeb
    使用 IntraWeb (44) 测试读取 SqLite (三)
    使用 IntraWeb (43) 测试读取 SqLite (二)
    使用 IntraWeb (42) 测试读取 SqLite (一)
    使用 IntraWeb (41) 数据控件速查
    使用 IntraWeb (40) 自定义 Session 数据
    使用 IntraWeb (39) THttpRequest、THttpReply
    使用 IntraWeb (38) TIWAppForm、TIWForm、TIWBaseHTMLForm、TIWBaseForm
    Kubernetes 运维小记:node 为系统保留最低资源
  • 原文地址:https://www.cnblogs.com/dongshuangjie/p/5306307.html
走看看 - 开发者的网上家园