Использование почтовой библиотеки из бизнес-уровня - PullRequest
5 голосов
/ 05 февраля 2012

У меня есть веб-сайт, созданный с использованием ASP.NET MVC3, который имеет следующий уровень:

  • ProjectName.Shared (модель + контракты на обслуживание)
  • ProjectName.Infrastructure
  • ProjectName.Data
  • ProjectName.Data.Sql
  • ProjectName.Managers (бизнес-уровень)
  • ProjectName.Services (службы WCF)
  • ProjectName.UI.Main (приложение ASP.NET MVC3)

Это структура, которую я недавно придумал после некоторого рефакторинга.К сожалению, не существует полного разделения между пользовательским интерфейсом и моим бизнес-уровнем, поэтому в этой области может быть использован еще один рефакторинг, чего я сейчас не могу сделать, потому что у меня сжатые сроки.

На данный момент мойклиент запросил некоторые новые функции, которые включают отправку электронных писем пользователям после того, как произошли некоторые события.В настоящее время веб-сайт отправляет электронные письма, используя библиотеку Postal , которая пока работает отлично.Это происходит в веб-приложении MVC, которое отличается от случая, который у меня есть для новых функций ...

Проблема:

У меня есть случай, когда янужно разрешить приватный метод внутри моего бизнес-уровня для рассылки электронных писем пользователям.Причина, по которой я не могу сделать это внутри метода Action, заключается в том, что существует множество путей кода, которые в конечном итоге вызывают этот закрытый метод.Так что это не совсем специфично для одного метода действия.

Предлагаемое решение:

Я имею в виду создание EmailsController , который я могувызвать его метод через вызовы HTTP-POST из моего бизнес-уровня.Затем я передал бы параметры, необходимые для отправки электронного письма через аргументы метода Action.

Но я нахожу это решение несколько ошибочным и хакерским.Поэтому я действительно хотел бы услышать некоторые мысли о том, как подойти к этой проблеме.

1 Ответ

0 голосов
/ 05 февраля 2012

Не могли бы вы не просто обернуть свою логику электронной почты за уровень сервиса или инфраструктуру или что-то еще и вызвать ее из контроллеров, а внедрить сервис через ваш конструктор? Вы делаете то же самое со своим бизнес-уровнем. Разве почтовый объект не требует что-то наследовать от asp.net?

namespace ProjectName.Infrastructure
{
    public interface IEmailService
    {
        void SendEmail(string address, string content)
        {
        }
    }

    public class EmailService : IEmailService
    {
        private void SendEmail(string address, string content)
        {
            //...send email via Postal
        }
    }
}

public class ControllerA
{
    private IEmailService emailService;

    public ControllerA()
    {
        emailService = new EmailService();
    }

    public ActionResult SendEmail(ViewModel model)
    {
        emailService.SendEmail(model.address, model.content);
    }
}
...