¿Qué es un buen ASP.NET MVC CMS como un buen punto de partida para un proyecto?

NopCommerce también es una buena plataforma para aprender. No solo su código fuente es sólido y está bien escrito, sino que también su arquitectura es simple de entender ya que sigue las mejores prácticas de desarrollo web.

Está escrito en C #, MVC5 y Razor y utiliza SQL Server con arquitectura de cebolla

NopCommerce como plataforma

NopCommerce está hecho de componentes que pueden ser utilizados por cualquier plataforma personalizada. Algunos de estos son:

  • Marco de la entidad
  • Inyección de dependencia
  • Soporte móvil
  • Configuraciones
  • Localización
  • Atributos Genéricos
  • Explotación florestal
  • Programar tareas y tareas de inicio
  • Memoria y almacenamiento en caché por solicitud
  • Publicación de eventos

Además, tiene características que pueden ser utilizadas por cualquier otra plataforma como:

  • Gestión de usuarios
  • Control de acceso
  • Temas
  • mensajes privados
  • Plantillas de correo electrónico
  • Correos electrónicos en cola
  • Gestión de País y Búsqueda de GeoCountry
  • Exportaciones PDF y Excel

Básicamente, eliminar toda la funcionalidad de NopCommerce y CMS nos dejaría con una base realmente sólida desde la cual puede comenzar a aprender o escribir nuevos proyectos de compilación personalizados y esa es la razón por la que llamo a NopCommerce una plataforma.

Repasemos cada uno de los puntos anteriores para descubrir más cuáles son.

1. Marco de la entidad

Crear una nueva entidad en NopCommerce es fácil. Solo necesita crear una nueva clase de dominio con propiedades simples que representen los nombres de sus columnas dentro del proyecto Nop.Core . Luego, en Nop.Data, cree una clase de mapeo que incluya la configuración de cómo se asignará esa clase a una tabla de base de datos. NopCommerce hace todo lo demás por ti. Entity Framework ya está configurado para obtener acceso a esa tabla a través de un repositorio. Solo necesita obtener una instancia de IRepository :

  var _companyRepository = EngineContext.Current.Resolve <IRepository > ();

Esta interfaz de repositorio le permite consultar e insertar / actualizar el nombre de la empresa:

  var query = _companyRepository.Table.Where (x => x.Location == "London"). ToList ();  // o _companyRepository.Insert (empresa);

Para seguir las mejores prácticas de NopCommerce , también debe crear un nuevo CompanyService en Nop. Servicios que incluyen métodos estándar para obtener por id, obtener todo, insertar, actualizar o eliminar. Dentro de este servicio, debe incluir cualquier método de acceso a datos que utilice el sitio web front-end para evitar el acceso directo a la base de datos.

2. Inyección de dependencia

NopCommerce viene con Autofac como el contenedor IoC para la inyección de dependencia. Para aquellos que no están familiarizados con esto, en palabras simples significa tener un lugar centralizado para controlar las instancias . En lugar de crear instancias dentro de una clase, esa clase se basa en un contenedor de IoC para obtenerlas. La principal ventaja, aparte de la superorganización de su código fuente, es que puede definir cómo se crean las instancias (condicionalmente o cuánto tiempo viven). Por ejemplo, solo se debe crear una instancia de CompanyService durante una solicitud http.

El contenedor se puede encontrar en Nop.Web.Framework que contiene una clase DependencyRegistrar . Puede registrar clases o interfaces. De hecho, NopCommerce utiliza interfaces para registrar todos sus servicios. Puede registrar sus propios servicios agregando más código a este archivo o creando su propia clase de registrador e implementando la interfaz IDependencyRegistrar:

  clase pública MyOwnDependencyRegistrar: IDependencyRegistrar

3. Soporte móvil

NopCommerce puede detectar automáticamente cuándo el usuario está navegando por el sitio desde un dispositivo móvil y, de ser así, servirá la vista con la extensión * .Mobile.cshtml si existe. Esto es realmente útil cuando se crea un sitio móvil separado reutilizando los mismos controladores.

Esta funcionalidad solía ser originalmente de nopCommerce, pero ahora es oficialmente compatible con ASP .Net MVC.

4. Configuraciones

Esta es una tabla simple con valores y clave. Por ejemplo, una clave como seosettings.pagetitleseoadjustment tiene un valor de StorenameAfterPagename . Simplemente puede agregar más valores a esta tabla mediante el panel de administración en Configuración> Configuración> Todas las configuraciones (Avanzado) en / Admin / Configuración / AllSettings

La configuración se almacena en la memoria caché pero se actualiza cada vez que la actualiza (utilizando el método SettingService.UpdateSetting ). Tenga cuidado, para actualizar los registros directamente en la base de datos, ya que no se reflejarán en línea a menos que se borre la memoria caché.

La mayoría de las configuraciones están predefinidas en clases simples dentro de Nop.Core, por ejemplo: AddressSettings , BlogSettings , etc. También puede crear sus propias configuraciones. Solo necesita crear una clase que implemente la interfaz ISettings , defina correctamente el tipo y el nombre de cada campo de propiedad y NopCommerce asignará automáticamente un registro que use la clave classname.propertyname en la tabla de configuración.

5. Localización

El sitio web multilingüe solía ser muy difícil para mí construir en el pasado, hasta que aprendí de la implementación de NopCommerce que en realidad puede ser muy simple.

Primero, hay una tabla de idiomas para almacenar cada idioma activo.

Luego, hay una tabla de Diccionario llamada LocaleStringResource donde cada texto que se muestra en el sitio se almacena como un registro para cada idioma. Si tiene una instalación inicial limpia de NopCommerce, verá que todos los registros solo tienen inglés (ID de idioma 1). Instalar un nuevo idioma es solo cuestión de importar más registros a esta tabla con un ID de idioma diferente.

Cuando descarga un paquete de idioma desde http: //www.nopcommerce.com/exten… solo está descargando un archivo XML que agrega más registros a la tabla del diccionario.

Finalmente, hay una tabla llamada LocalizedProperty que traduce cualquier propiedad de cualquier entidad . Las entidades como Producto, Categoría o Tema ya están configuradas para tener propiedades localizadas mediante la implementación de la interfaz ILocalizedEntity .

Para ingresar datos en varios idiomas, Nop Admin le mostrará todas las propiedades (localizadas) dentro de una pestaña, y cada pestaña será un idioma diferente.

Para mostrar una propiedad en un idioma específico, hay clases de extensiones que facilitan su obtención. Por ejemplo: Nop.Services.Localization.LocalizationExtentions tiene un método de extensión llamado GetLocalized que le dará el valor de propiedad de la identificación del idioma de trabajo.

6. Atributos genéricos

Esta es una de las características más útiles en NopCommerce porque le permite tener atributos personalizados adicionales en cualquier entidad.

Funciona de manera similar a LocalizedProperty pero no necesita implementar ninguna interfaz.

Para guardar un nuevo atributo personalizado, use el método SaveAttribute en el servicio GenericAttributeService , de esta manera:

  _genericAttributeService.SaveAttribute (tema, "backgroundColor", "#efefef", _storeContext.http: //CurrentStore.Id);

Para obtener un atributo personalizado, use el método de extensión GetAttribute en Nop.Services.Common.GenericAttributeExtentions y recupérelo así:

  topic.GetAttribute ("backgroundColor", _storeContext.http: //CurrentStore.Id)

Desafortunadamente, actualmente no es posible editar estos atributos desde el panel de administración.

7. Registro

Implementación simple pero efectiva para registrar mensajes de error o información. Estos registros se almacenan en la tabla de registro en la base de datos e incluyen información muy útil, como el seguimiento completo de la pila, el cliente actual, la dirección IP, la URL de la página donde ocurrió el error y la página de referencia.

Para registrar un mensaje, simplemente use cualquiera de los métodos de extensión dentro de Nop.Services.Logging.LoggingExtensions. Puede usarlo recibiendo una instancia de Ilogger:

  _logger.Error ("El tema no existe")

8. Programar tareas y tareas de inicio

Esta es siempre una funcionalidad en la que he fallado un par de veces en el pasado. Con NopCommerce, esto es muy sencillo. Una tarea de programación es una función que se ejecuta periódicamente cada X número de segundos. Hay 5 tareas programadas creadas previamente, pero nada le impide crear una nueva. Aquí es cómo:

Cree una nueva clase que implemente la interfaz ITask . Simplemente ponga su función dentro de Ejecutar . No podría ser más simple. Lo bueno es que puede recibir cualquier instancia de otras clases, como servicios, ayudantes o configuraciones, a través del constructor.

Lo último es registrar su tarea en la tabla ScheduleTask. Desafortunadamente, no hay forma de hacerlo en el administrador, por lo que deberá agregarlo directamente a la base de datos.

Para que toda esta magia funcione, NopCommerce utiliza un temporizador dentro de la clase Nop.Services.Tasks.TaskThread . Es increíblemente simple compararlo con otras soluciones para tareas programadas.

También hay una interfaz llamada IStartupTask que funciona de la misma manera que las tareas programadas. La única diferencia es que no necesita registrarlo y, como su nombre lo indica, se ejecuta al inicio, esto es cuando se reinicia la aplicación. Esto es muy útil para servicios adicionales que de otro modo pondría en Global.asax Application_Start. En su lugar, cree una clase que implemente IStartupTask.

9. Memoria y almacenamiento en caché por solicitud

Hay dos formas de almacenar en caché sus elementos en NopCommerce: memoria y por solicitud. El almacenamiento en memoria caché le permite almacenar objetos en el disco hasta que caduquen o se borren manualmente. Por solicitud solo durará la duración de una vida de solicitud http. Almacena artículos en HttpContent.Current.

Ambos tipos están registrados en DependencyRegistrar.cs con un nombre:

  builder.RegisterType (). As (). Nombrado ("nop_cache_static"). SingleInstance ();  builder.RegisterType (). As (). Nombrado ("nop_cache_per_request"). InstancePerHttpRequest ();

Puede elegir dónde almacenar en caché los elementos en la memoria (estática) o por solicitud al registrar instancias de otros servicios agregando:

  .WithParameter (ResolvedParameter.ForNamed ("nop_cache_static"))

o

  .WithParameter (ResolvedParameter.ForNamed ("nop_cache_per_request"))

Por defecto, si WithParameter no está incluido, usará el último tipo registrado en este caso PerRequestCacheManager .

10. Publicación de eventos

Esta es una de esas piezas ocultas de la arquitectura de software que son extremadamente útiles. En NopCommerce puedes activar eventos y conectarlos a ellos. En NopCommerce usted publica un evento y ellos lo consumen . Básicamente, puede publicar en cualquier lugar durante el código de su código y enviar como parámetro todo lo que desee. Un buen ejemplo de esto es el evento desencadenado después de realizar un pedido. Esto es literalmente después de que se haya insertado un Pedido en la base de datos con un estado Colocado . Si observa de cerca el código y profundiza en los métodos de Extensión, encontrará la siguiente línea:

  eventPublisher.Publish (nuevo OrderPlacedEvent (orden));

OrderPlacedEvent es solo una clase simple que actúa como un parámetro. Como se mencionó anteriormente, puede enviar cualquier clase aquí. En este caso, esta clase también incluye una referencia al pedido recién creado.

Luego, para engancharse a un evento, crea un consumidor. Un consumidor es básicamente cualquier clase que implementa la interfaz IConsumer . En el ejemplo anterior, un complemento llamado “Nop.Plugin.SMS.Verizon” implementa uno de la siguiente manera:

  clase pública OrderPlacedEventConsumer: IConsumer  {public void HandleEvent (OrderPlacedEvent eventMessage) {// su código aquí}}

Eso es. NopCommerce se puede extender muy bien a través de ganchos de eventos, todo solo con unas pocas líneas de código.

umbraco

Es maduro, maleable y tiene una gran comunidad. También puede manejar esas situaciones molestas, como cuando 22 millones de personas quieren visitar su sitio porque alguien se lanza en paracaídas desde el espacio. OK, eso no sucede a menudo, pero es un testimonio de la arquitectura sólida como una roca del umbraco.

¿Mencioné que podría decirse que es uno de los mejores proyectos de software de código abierto escritos en la pila de MS?

Mucha suerte con tu proyecto.

Saldré y declararé lo obvio: no hay ninguno.

En gran medida, esto es un reflejo del tiempo y la economía. En cuanto al tiempo, los productos CMS muy populares que conocemos datan de la primera parte de los años, mientras que MVC salió en la última parte de esa década. Desde el punto de vista económico, el principal punto de venta de los productos populares de CMS fue el producto gratuito, las licencias baratas y los desarrolladores PHP baratos. Si bien el alojamiento es probablemente un lavado hoy, no fue hace 5-10 años y hay muchas, muchas más personas que pueden hackear un complemento de WordPress y luego implementar correctamente las aplicaciones .NET MVC.

Puedo decir que después de haber construido un CMS robusto basado en MVC de .NET que fue reemplazado por Drupal y WordPress, tiene mucho más sentido dejar que esas plataformas populares controlen el front-end web público, ya que son mejores y más baratas en este momento. Guarde la aplicación .NET para un trabajo real, si necesita exponer cosas al CMS que es exactamente donde juega la API web.