В настоящее время у вас есть:
public interface IMessageSender
{
Task SendMessageAsync(parameters);
}
и два класса, которые реализуют этот интерфейс.Это работает, но я бы предложил немного изменить этот подход.Сохраните IMessageSender
и добавьте два новых интерфейса:
public interface IEmailSender : IMessageSender
{
}
public interface ISMSSender : IMessageSender
{
}
Зачем это нужно?Что ж, теперь он позволяет вам вводить в конкретного отправителя, который вас интересует (этот контроллер хочет отправлять электронные письма, этот контроллер хочет отправлять SMS).
Кроме того, поскольку они оба наследуются от IMessageSender
, с некоторыми контейнерами IoC (например, Autofac - я не проверял их все), вы также можете добавить коллекцию IMessageSender
(то есть IEnumerable<IMessageSender>
) -это не всегда полезно, но может быть полезно, если вы хотите вызвать всех отправителей сообщения (т. е. отправьте SMS по этому номеру и по электронной почте).Если это бесполезно - не проблема, удалите IMessageSender
в целом (и переместите методы, определяющие интерфейс, в IEmailSender
и ISMSSender
).
Теперь измените классы, чтобы реализовать новыеинтерфейсы:
public class EmailSender : IEmailSender
{
}
public class SMSSender : ISMSSender
{
}
и зарегистрируйте ваши классы для обоих интерфейсов в вашем контейнере. С Autofac это было бы что-то вроде AsImplementedInterfaces
.
Глядя на ваш существующий код, я бы предложил следующее решение:
services.AddTransient<IEmailSender, EmailSender>();
services.AddTransient<ISMSSender, SMSSender>();
services.AddTransient<IMessageSender, EmailSender>();
services.AddTransient<IMessageSender, SMSSender>();
Затем измените ваш контроллердо:
public MyController(IEmailSender emailSender, ISMSSender smsSender)