(я предполагаю, что вы знаете принципы наизусть, поэтому я не буду объяснять, что они означают)
Единственная ответственность: потому что контроллер заботится о получении данных из базы данных (что обычно делается черезхранилище или комбо-сервис-репозиторий), а также отправка электронной почты, которая должна быть в службе, используемой в контроллере.
Принцип открытого-закрытого: класс отправителя электронной почты реализован в том же месте, что ипоэтому контроллер явно не открыт для расширения и закрыт для модификации
Разделение интерфейса: вообще не используется
Инверсия зависимостей: вообще не используется, например, класс репозитория и отправка электронной почтысервис должен быть скрыт за интерфейсами (т.е. IEmailSender, IMyDataRepository), а контроллер должен использовать тех, кто не знает / не заботится о точной реализации.Еще лучше, если его использовать вместе с внедрением зависимостей -> контроллер получит экземпляры классов, реализующих эти интерфейсы в конструкторе, используя Unity, SimpleInjector и т. Д.
Лисков: иерархия классов, интерфейсы и т. Д. Не используются.
Если бы мне пришлось реализовать что-то вроде этого:
public class EmailController : Controller
{
// Interface segregation applied
private IEmailSendingService emailService;
private IUserService userService;
private ILoggingService loggingService
// Dependency inversion principle / Dependency injection applied
public EmailController(IEmailService mailSrvc, IUserservice usrSvc, ILoggingService log)
{
this.emailService = mailSrvc;
this.userService = usrSvc;
this.loggingService = log;
}
public ActionResult SendEmail()
{
try
{
var emailAddress = this.userService.GetEmail(...);
// validate email address, maybe through another service
if(Validator.ValidateEmail())
{
// Single responsibility applied
this.emailService.SendEmail(emailAddress);
}
}
catch(MailNotFoundException ex)
{
this.loggingService.LogError("Email address not found for xy user");
return NotFound();
}
catch(EmailSendingFailedException ex)
{
this.loggingService.LogError("Could not send email because xyz");
// return internalservererror etc.
}
catch(Exception ex)
{
this.loggingService.LogError("...");
}
// return whats needed
}
}
Пример не безупречен, но вы можете понять его суть:)