ASp.NET MVC - ¿Es posible simplificar mi arquitectura?

Acabo de empezar a trabajar en un proyecto de MVC y todo va bien, pero parece que estoy creando mucho código espagueti con demasiados objetos. ¿Alguien puede ver cómo puedo simplificar esta solución antes de que todo el proyecto se salga de control?

ok, aquí está mi configuración:

DAL - tiene conexiones y métodos de Entity Framework para obtener datos y luego convertir los datos a mis objetos de modelo en la capa de modelo

BLL - envía los datos de vuelta al modelo de interfaz de usuario: este contiene todos los objetos del modelo que se usan en todo el sitio, cualquier cosa que provenga del DAL se convierte en estos objetos al crear un nuevo objeto y luego completar las variables.

UI - mi solución MVC

Otras soluciones también utilizan DAL, BLL y Model.

Ahora, con MVC, estoy tratando de usar las anotaciones de validación ([Obligatorio], etc.), lo que significa que tengo que volver a crear los objetos del modelo con las anotaciones. Esto está bien, pero si quiero volver a guardar los datos en la base de datos, necesito convertir las clases, lo cual es un desastre.

¿Alguien puede ver cómo puedo usar mi biblioteca de clases de modelo actual con objetos de modelo MVC que usan las anotaciones de validación?

Si no me he explicado claramente por favor hágamelo saber y le daré más detalles.

Muchas Gracias

preguntado el 03 de mayo de 12 a las 12:05

4 Respuestas

Idealmente, debe haber un separación de los modelos de dominio por un lado y los modelos MVC (realmente son VerModelos) en la otra mano. Esta separación es realmente crucial y muy recomendable.

Estos se verán muy similares en la mayoría de los casos, aunque ViewModel puede contener cosas adicionales. Entonces puedes usar AutoMapper convertir de uno a otro.

Por ejemplo:

public class User // in entity DLL
{
    [Required]
    public string Name {get; set;}
}

public class UserViewModel : User // in MVC DLL
{
    public string LastVisitedPage {get; set;} // which only MVC needs to know
}

Mapper.Map<User, UserViewModel>();
Mapper.Map<UserViewModel, User>();

contestado el 03 de mayo de 12 a las 12:05

Hola, acabo de recibir automapper y esto es genial!!! ¡muchas gracias! Esto ahorra mucho mapeo tedioso :) - miedoso

@Funky sí, es realmente una herramienta útil. - Alióstad

puede colocar los metadatos en objetos de metadatos sin volver a crear los objetos del modelo. Aquí hay una forma muy simple de hacerlo, sin embargo, requiere que los objetos del modelo estén marcados como parciales. Espero que esté bien, si no, esta solución no funcionará para usted.

[MetadataType(typeof(PreviousResultsMetaData))]
public partial class PreviousResults
{
    public class PreviousResultsMetaData
    {
        [DisplayName("Class Ranking Score")]
        [Required]
        [Range(0.0, 100.0)]
        public object ClassRankingScore { get; set; }
    }
}

en el ejemplo anterior, hay un objeto de modelo de datos llamado PreviousResults que se crea en otro lugar mediante algún código de andamiaje. Define el objeto POCO que se envía hacia y desde la base de datos mediante LINQ. El atributo MetadataType indica la clase que se utilizará para contener los metadatos. Luego, simplemente cree objetos simples que coincidan con los nombres de sus miembros de datos reales y anótelos.

Espero que esto ayude.

contestado el 03 de mayo de 12 a las 12:05

Puede usar el marco FluentValidation para la validación. Mira aquí

http://fluentvalidation.codeplex.com/

contestado el 03 de mayo de 12 a las 12:05

Perfectamente puedes añadir atributos a tu BLL (el entidades de negocios). Simplemente agregue una referencia y agregue una declaración de uso para System.ComponentModel.DataAnnotations. Aparte de eso, puede implementar el IVvalidatableObject interfaz (que es bastante fácil, ver más abajo).

Para el mapeo, puede usar por ejemplo AutoMapper, por lo que no tiene que escribir gran parte de la lógica de mapeo usted mismo (si puede aprovechar la magia del mapeo de nombres).

Validar ejemplo:

ICollection<ValidationResult> validationErrors = new List<ValidationResult>();
var validationContext = new ValidationContext(this, null, null);
Validator.TryValidateObject(this, validationContext, ValidationErrors, true);

return validationErrors;

contestado el 03 de mayo de 12 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.