2012-05-03 27 views
7

Acabo de empezar a trabajar en un proyecto de MVC y las cosas van bien, pero parece que estoy creando un montón de código de espagueti con demasiados objetos. ¿Alguien puede ver cómo puedo simplificar esta solución antes de que todo el proyecto se salga de control?ASp.NET MVC - ¿Es posible simplificar mi arquitectura?

bien, aquí está mi puesta a punto:

DAL - tiene conexiones y los métodos para obtener los datos a continuación, convertir los datos a mis objetos del modelo en la capa del modelo

BLL Entity Framework - envía el Copia de seguridad de los datos a la UI Modelo: contiene todos los objetos del modelo que se usan en todo el sitio, todo lo que proviene del DAL se convierte en estos objetos al crear un nuevo objeto y rellenar las variables.

IU - mi solución MVC

El DAL, BLL y modelo también son utilizados por otras soluciones.

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 guardar los datos nuevamente en la base de datos, necesito convertir las clases, lo cual es simplemente desordenado.

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

Si no me he explicado claramente, por favor avíseme y proporcionaré más detalles.

Gracias

Respuesta

3

Lo ideal es necesario que haya una separación a partir de los modelos de dominio por un lado y los modelos MVC (en realidad son ViewModels) por otro lado. 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 elementos adicionales. Luego puede usar AutoMapper para 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>(); 
+0

Hola, acaba de recibir AutoMapper y esto es brillante !!! ¡muchas gracias! Esto ahorra una gran cantidad de mapeo tedioso :) – Funky

+0

@Funky sí, es realmente una herramienta útil. – Aliostad

1

puede poner los metadatos de objetos de metadatos sin volver a crear los objetos del modelo. Aquí hay una manera muy simple de hacerlo, sin embargo, requiere que los objetos modelo se marquen 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 no es un objeto de modelo de datos llamado PreviousResults que se crea en otro lugar por algún código de andamios. Define el objeto POCO que se envía desde y hacia la base de datos utilizando LINQ. El atributo MetadataType indica la clase que se usará para contener los metadatos. Luego, simplemente crea objetos simples que coincidan con los nombres de sus miembros de datos reales y los anote.

Espero que esto ayude.

0

Puede agregar perfectamente atributos a su BLL (entidades comerciales). Simplemente agregue una referencia y agregue una declaración using para System.ComponentModel.DataAnnotations. Aparte de eso, puede implementar la interfaz IValidatableObject (que es bastante fácil, consulte a continuación).

Para la asignación, puede usar, por ejemplo, AutoMapper, por lo que no tiene que escribir mucho sobre lógica de mapeo usted mismo (si puede aprovechar la magia de 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; 
Cuestiones relacionadas