2012-02-05 18 views
5

Tengo un sitio web construido con ASP.NET MVC3 que está en capas de la siguiente manera:Biblioteca Postal de la capa de negocios

  • ProjectName.Shared (+ modelos de contrato de servicio)
  • ProjectName.Infrastructure
  • ProjectName.Data
  • ProjectName.Data.Sql
  • ProjectName.Managers (capa de negocios)
  • ProjectName.Services (WCF)
  • ProjectName.UI.Main (aplicación ASP.NET MVC3)

Esto es en realidad la estructura recientemente se me ocurrió después de algún refactorización. Desafortunadamente, no existe una separación completa entre la interfaz de usuario y mi capa de negocios, por lo que esta área podría usar más refactorización, lo cual no puedo hacer ahora porque tengo un plazo ajustado.

Por el momento, mi cliente ha solicitado algunas funciones nuevas que implican el envío de correos electrónicos a los usuarios después de que sucedan algunos eventos. La forma en que el sitio web actualmente envía correos electrónicos es mediante el uso de la biblioteca Postal, que está funcionando muy bien hasta el momento. Eso pasa desde dentro de la aplicación web MVC, que es diferente del caso que tengo para las nuevas características ...

El problema:

tengo el caso en el que tengo que dejar un método privado dentro de mi capa de negocios para enviar los correos electrónicos a los usuarios. La razón por la que no puedo hacer eso dentro de un método de Acción es porque hay muchas rutas de código que eventualmente terminan llamando a este método privado. Por lo tanto, no es realmente específico para un método de Acción.

Solución propuesta:

Lo que tengo en mente es crear un EmailsController que puedo llamar a su método a través de HTTP POST llamadas desde dentro de mi capa de negocio. Luego transmitiría los parámetros necesarios para enviar el correo electrónico a través de los argumentos del método de Acción.

Pero esta solución me parece un poco defectuosa y hacky. Entonces, realmente me gustaría escuchar algunas ideas sobre cómo abordar este problema.

Respuesta

0

¿No podría simplemente envolver su lógica de correo electrónico detrás de una capa de servicio o infraestructura o lo que sea y llamarlo desde los controladores, e inyectar el servicio a través de su constructor? Haz lo mismo con tu capa de negocios. A menos que el objeto postal requiera algo heredar a 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

Eso es exactamente lo que tenía antes de recurrir a Postal que depende de ASP.NET MVC. Le permite crear correos electrónicos HTML como vistas ASP.NET MVC que están vinculadas al objeto @Model que se envía desde el método de acción del controlador. – Kassem

+0

El hecho de que Postal dependa directamente de las vistas de MVC y el motor de afeitado para la generación de correo electrónico es el gran problema aquí. Yo también estoy enfrentando este problema y me encantaría saber si hay una mejor manera. – ryanulit

+0

Me doy cuenta de que tiene un año de antigüedad, pero Postal usará RazorEngine (http://antaris.github.io/RazorEngine/) tan felizmente como el motor de vista Razor incorporado, como se indica aquí: http: // aboutcode. net/postal/outside-aspnet.html –

Cuestiones relacionadas