Gracias a todos por dar una visión sobre cómo están manejando. He reunido muchos conocimientos desde aquí. Me gustó @MartinHN usando el analizador Razor con el Modelo de datos concreto.
Sin embargo, algo no funcionó muy bien para mí.
Requisito:
tengo para almacenar plantillas de correo electrónico de tal manera que puedo mostrar la misma a
Los interesados en cualquier momento. Por lo tanto, debe estar disponible para navegar a través de la Intranet , preferiblemente a través del sitio web de sae como API alojada.
Los diseñadores de front-end deberían poder modificar las plantillas fácilmente. Por lo tanto, quiero almacenarlo en formato HTML sin formato para que el diseñador no tenga que pasar por demasiados detalles técnicos.
Las plantillas de correo electrónico deben estar fácilmente disponibles para las modificaciones de los administradores (necesidad futura). En un futuro próximo, habrá notificaciones diferentes para SMS, Pantalla. Por lo tanto, las plantillas son diferentes.
Sobre la base de estos requisitos, hice lo siguiente:
Desde que estaba usando MVC, he creado una carpeta llamada "estático" que es disponibles para ser navegado directamente (y el motor MVC/el controlador http excluye esta carpeta de realizar sus actividades de MVC).
Con este enfoque podría fácilmente lograr primer requisito y yo podría enviar mi enlace a las partes interesadas como http://api.aksdfjl.com/static/welcomeemailtemplate.html
Cada plantilla de correo electrónico ha dado su propio código HTML, por lo que fue fácil para el diseñador a acceda a lo mismo y remítalo en su repositorio como un atajo a mi carpeta de repositorio. El HTML tiene CSS en línea y es completamente un html independiente - por correo electrónico.
El último requisito principal era mantener estos diseños y el usuario puede modificarlos. Bueno, entonces definitivamente no quiero tratar a través del sistema de archivos. Lo que hice ahora es que estas notificaciones se almacenan en la base de datos y las inicializo una vez. Después de eso, el panel de administración tiene un editor wysiwyg html que puede darles una vista previa rápida y controlar a qué se debe enviar.
Ahora quería asegurarse de que los futuros requisitos son manejados fácilmente y ya que mi empresa fue la introducción de diferentes notificaciones de modo diferente, como el correo electrónico, pantalla, notificaciones por SMS. Decidí ampliar el diseño del software con la ayuda del XML de inicializador de plantilla que almacena estas respuestas.
La madre de toda la plantilla llamada - MessageTemplates.xml almacena información diferente que necesito para inicializar diferentes tipos de plantillas, por ejemplo, correo electrónico, sms, pantalla y demás.
Aquí es cómo el código es el mismo.
[HttpGet]
[Route("applications/initializenotificationtemplate")]
public IHttpActionResult InitializeNotificationTemplate()
{
return
InitializeNotificationTemplate(Path.Combine(HostingEnvironment.ApplicationPhysicalPath,
@"Static\InitializeData\MessageTemplates.xml"));
}
[NonAction]
public IHttpActionResult InitializeMailTemplate(string filePath)
{
try
{
_applicationService.InitializeTemplate(filePath);
return Ok("Application Notification templates are initialized.");
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
_applicationService.InitializeTemplate tiene la siguiente definición:
public bool InitializeTemplate(string filePath)
{
if (string.IsNullOrEmpty(filePath))
{
throw new ArgumentNullException("File Path");
}
if (!File.Exists(filePath))
{
throw new FileNotFoundException(filePath);
}
var data = _notificationTemplateService.Get();
var exceptionMessages = string.Empty;
if (data != null)
{
var historicalTemplates = data.ToList();
historicalTemplates.ForEach((d) => _notificationTemplateService.Delete(d, out exceptionMessages));
}
XDocument xmlDocument = XDocument.Load(filePath);
IEnumerable<NotificationTemplate> templates = (from template in xmlDocument.Descendants("Template")
select new NotificationTemplate()
{
Title = template.Element("Subject").Value,
Description = template.Element("Body").Value,
Type = (NotificationTypeOptions)Enum.Parse(typeof(NotificationTypeOptions), template.Element("Type").Value, true),
Category = (NotificationCategoryOptions)Enum.Parse(typeof(NotificationCategoryOptions), template.Attribute("category").Value, true),
}).ToList();
foreach (var t in templates)
{
var path = Path.Combine(Path.GetDirectoryName(filePath), Regex.Replace(t.Description, @"\t|\n|\r| ", ""));
if (File.Exists(path))
{
StreamReader reader = new StreamReader(path);
t.Description = reader.ReadToEnd();
}
else
{
t.Description = string.Empty;
}
}
return _notificationTemplateService.InsertRange(templates, out exceptionMessages);
}
Así es como mi modelo parece que es igual que el modelo de base de datos (código de primera - enfoque FE).
public class NotificationTemplate : IdentityBase
{
public string Category { get; set; }
public NotificationTypeOptions Type { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public NotificationTemplate()
{
Type = NotificationTypeOptions.Email;
}
}
[Flags]
public enum NotificationTypeOptions
{
Email = 0,
Screen = 1,
}
Por primera vez, cuando instalo mi solicitud me llaman inicializar llamada a la API que se instalan mis plantillas de notificación a la base de datos y todas las demás opciones están disponibles y listos para usar.
Ahora con este enfoque hice que todos estuvieran contentos en la organización y tiene una gran fortaleza para extender esto aún más, por lo que es fácil para mí presentar también nuevas plantillas.
He utilizado archivos xml en mi sitio web y me ha permitido escalar las características compatibles con las plantillas de correo electrónico de forma espectacular. –