我已将抽象 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)
{
}