simplemembership - software - three layer programming
SimpleMembership-¿Alguien lo hizo amigable para n-tier? (4)
Creo que su pregunta se relaciona más con SoC que con la arquitectura de n niveles (que trata más sobre la separación física entre capas, como lo señala @klatzib).
Yo diría que la lógica dentro de los proveedores de membresía no debe ser clasificada como lógica de negocios ya que no contienen código específico de la aplicación o del cliente. De hecho, la idea del modelo de proveedor es que cumple un contrato genérico independientemente del contexto en el que se utiliza. Un error común que cometen los desarrolladores es extender MembershipProvider
y ajustar la lógica de negocios específica de la aplicación que debería existir en una capa superior. Si eso es lo que quiere lograr con un diseño alternativo, entonces ese es el enfoque equivocado. Los proveedores son complementos para el marco .NET, y deben estar completamente abstraídos del código. Ciertamente, no deberían contener su dominio de aplicación, y rara vez debería necesitar extenderlos.
Dirigiendo su pregunta de otra manera, ¿ SimpleMembershipProvider
prohíbe SoC en el diseño de aplicaciones o incluso en la arquitectura de n niveles? No, no lo hace. La plantilla MVC4 está diseñada para simplificar, pero el ActionFilter
utilizado para inicializar el proveedor no forma parte de la implementación de la membresía, y usted es libre de inicializar el proveedor de la manera que considere adecuada (prefiero hacer esta llamada desde una fábrica de contenedores DI método). De hecho, SimpleMembershipProvider
no es una dependencia directa de EF, así que sí, es posible eliminar las referencias a EF DbContext en su aplicación web.
Se nos dice que "SimpleMembership" es el futuro de la gestión de membresía / rol asp.net. La plantilla de "Aplicación de Internet" MVC4 implementa la administración de cuentas utilizando SimpleMembership. Sin embargo, la forma en que se implementa fusiona todos los niveles de aplicación en 1.
Me sorprendió que después de todo el trabajo que han puesto en las aplicaciones de capas correctamente con MVC, obtengamos esta aplicación de mala calidad de "el camino a seguir" para la membresía sin DI, el uso de DLL de WebMatrix y la falta completa de SoC. Particularmente ActionFilterAttribute for SimpleMembershipInitialization: hereda de un atributo MVC y realiza llamadas al EF DBContext directamente.
Me doy cuenta de que estoy siendo perezoso, pero ¿alguien ha hecho una plantilla "adecuada" usando SimpleMembership que significa que puedo tener niveles separados apropiados en mi aplicación y no tener referencias de EF DBContext en mi aplicación MVC?
Exactamente lo que estaba buscando (casi). Solo desearía que no estuviera vinculado a los marcos de entidades ya que esperaba que la solución n-tier de Kevin funcionara con Dapper ORM :(
La respuesta aceptada no es correcta, eso no es N-Tier. El acceso a los datos de la membresía y la lógica empresarial están ocurriendo en la misma capa. El hecho de que el código esté en un ensamblaje diferente no significa que no esté en la misma capa.
Sin algún tipo de mecanismo de transporte a la capa de acceso a datos, esto no es N-Tier.
La solución es heredar y anular la clase WebMatrix SimpleMembershipProvider de modo que sus llamadas de acceso a datos se puedan realizar en un host separado.
Recomiendo usar dotPeek para ver SimpleMembershipProvider para que sepa qué hacer en sus anulaciones.
Uno de los poderosos conceptos de SimpleMembership es que puede personalizar el perfil de usuario para que se ajuste a las necesidades de su aplicación, como se explica en este artículo . Por ejemplo, es posible que desee agregar una confirmación por correo electrónico a su proceso de registro que requerirá almacenar la dirección de correo electrónico del usuario en el perfil del usuario. En la administración de roles / membresía anterior para ASP.NET, esto era muy feo de implementar y las propiedades agregadas se almacenaban en un blob. Que asco
Entonces, ¿qué tiene esto que ver con tu pregunta para hacer que SimpleMembership sea amigable con n-tier? Si bien estoy de acuerdo en que lo que genera la plantilla no es amigable para n niveles, también afirmaría que la mayoría de las aplicaciones MVC reales de cualquier complejidad requerirán la personalización de SimpleMembership, y por lo tanto requerirán crear un nivel o capa que sea específico para los requisitos de la aplicación. Dicho de otra manera, crear un nivel reutilizable para SimpleMembership solo sería útil en las aplicaciones MVC más básicas.
Personalmente, he llegado a la conclusión de que lo que se genera mediante la plantilla de Internet con respecto a SimpleMembership casi siempre se modificará. Como el primer artículo al que hice referencia señala que la primera parte de la personalización es deshacerse del atributo SimplemembershipInitialization, que es solo una forma perezosa de inicializar SimpleMembership en caso de que el desarrollador no esté usando la autenticación de formularios. Y a menudo querrá mover el DBContext utilizado por SimpleMembership al DBContext para el resto de su aplicación. Los perfiles de usuario suelen estar estrechamente integrados con el resto del dominio de la aplicación.
Y como estamos en el tema de la seguridad de SoC y ASP.NET, diría que ASP.NET nunca fue tan bueno en esto. Para la autenticación de formularios, utiliza un atributo de Autorización en sus controladores y / o acciones que tienen un rol como parámetro. Esto obliga al desarrollador de la aplicación a pensar en el diseño de seguridad al diseñar el dominio de la aplicación. Tienes que determinar qué roles tendrá la aplicación por adelantado, y no dejes que cambien más tarde porque ahora debes pasar por todos esos atributos y actualizarlos según corresponda. Comencé a usar un atributo de autorización personalizado que toma como parámetros un nombre de recurso y un tipo de operación (por ejemplo, leer, escribir, ejecutar ...). Entonces puedo asignar roles a recursos / operaciones en una base de datos para que pueda cambiar fácilmente, o incluso permitir que un administrador realice cambios en la forma en que se implementan los roles en la aplicación. Microsoft está tomando el mismo enfoque con ClaimsPrincipalPermissionAttribute ahora que han incorporado WIF en .NET 4.5.
Actualizado 3/8/2013
He creado un proyecto de código abierto en CodePlex llamado SimpleSecurity que separa a SimpleMembership de la aplicación MVC. Puedes leer sobre esto aquí . Sigo pensando que lo más probable es que los desarrolladores quieran modificar SimpleSecurity, pero como es una fuente abierta, pueden hacerlo. Veremos si esto es algo que podemos evolucionar para ser una Membresía Simple reutilizable y mejor.