2012-02-05 3 views
5

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

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

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

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

Проблема:

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

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

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

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

ответ

0

Не могли бы вы просто обернуть свою логику электронной почты за уровень сервиса или инфраструктуру или что-то еще, и вызвать его из контроллеров, а также ввести службу через ваш конструктор? Вы делаете то же самое со своим бизнес-слоем. Если почтовый объект не требует чего-то наследуемого 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); 
    } 
} 
+0

Это на самом деле то, что я имел, прежде чем прибегать к Postal, который зависит от ASP.NET MVC. Он позволяет создавать HTML-письма в виде представлений ASP.NET MVC, которые привязаны к объекту @Model, который отправляется из метода действия контроллера. – Kassem

+0

Тот факт, что Postal напрямую зависит от представлений MVC и механизма бритвы для генерации электронной почты, является большой проблемой здесь. Я тоже столкнулся с этой проблемой и хотел бы узнать, есть ли лучший способ. – ryanulit

+0

Я понимаю, что это год, но Postal будет использовать RazorEngine (http://antaris.github.io/RazorEngine/) так же счастливо, как встроенный механизм просмотра Razor, как указано здесь: http: // aboutcode. сеть/почтовый/вне-aspnet.html –

Смежные вопросы