确定在 asp.net core 中发送不同类型电子邮件的最佳架构

问题描述 投票:0回答:0

我已将抽象 IEmailManager 定义为具有发送方法。电子邮件控制器使用其具体类型 EmailManager 作为发送电子邮件的构造函数依赖项。

public interface IEmailManager
{
    void SendEmail();
}
public class EmailManager : IEmailManager
{
    private readonly SmtpCredentials _smtpCreds;

    public EmailManager(SmtpCredentials smtpCreds)
    {
        _smtpCreds = smtpCreds;
    }

    public void SendEmail()
    {
        
    }
}

我在 .net 核心中使用依赖注入注入了具体类型。

buidler.Services.AddSingleton<IEmailManager, EmailManager>();

现在有发送不同类型邮件的需求SummaryEmailManager。我创建了一个名为 SummaryEmailManager 的新类型,它将实现相同的接口。

public class SummaryEmailManager : IEmailManager
{
    private readonly SmtpCredentials _smtpCreds;

    public SummaryEmailManager(SmtpCredentials smtpCreds)
    {
        _smtpCreds = smtpCreds;
    }

    public void SendEmail()
    {

    }
}

我可以通过以下两种方式实现它,请提出最合适的方法,或者您可以提出不同的最佳方法。

我可以使用依赖注入为 .Net 6 中的两种具体类型添加单例,就像 program.cs 中的以下代码一样。

    builder.Services.AddSingleton(Configuration.GetSection("SmtpSettings").Get<SmtpCredentials>());
builder.Services.AddSingleton<IEmailManager, EmailManager>();
builder.Services.AddSingleton<IEmailManager, SummaryEmailManager>();
public EmailController(IEnumerable<IEmailManager> emailManagers)
{}

或者我可以创建 IEmailManagerFactory 并将其具体类型创建为 EmailManagerFactory,它将根据开关案例/条件返回 IEmailManager。

public interface IEmailManagerFactory
{
        IEmailManager Create();
}

public class EmailManagerFactory : IEmailManagerFactory
{
        public IEmailManager Create(string type)
        {
            switch (type)
            {
                case "Sumamry":
                    return new EmailManager(_smtpCreds);
                default:
                    return new SummaryEmailManager(_smtpCreds);
            }
        }
 }

并使用此 Facotry 作为 DI 注入到 EmailController 中。

buidler.Services.AddSingleton<IEmailManagerFactory, EmailManagerFactory>();
public EmailController(IEmailManagerFactory emailManagerFactory)
{
   
}
asp.net-core dependency-injection factory-pattern design-principles factory-method
© www.soinside.com 2019 - 2024. All rights reserved.