• 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,所以我们的会覆盖默认的。

    到此结束!

  • 相关阅读:
    Title
    2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧!
    1+x证书《Web前端开发》等级考试样题
    云服务器、VPS、虚拟主机三者之间的区别?
    1+X”中级Web前端证书对应课程分析
    轻松装Win10:VMware Workstation 12虚拟机下载
    网站收录提交入口
    使用coding和hexo快速搭建博客
    宝塔安装Lsky Pro图床教程
    jsDeliver+github使用教程,免费的cdn
  • 原文地址:https://www.cnblogs.com/dongshuangjie/p/5306307.html
Copyright © 2020-2023  润新知