2012-05-03 11 views
7

Ho appena iniziato a lavorare su un progetto MVC e le cose stanno andando bene, ma sembra che sto creando un sacco di codice spaghetti con troppi oggetti. Qualcuno può vedere come posso semplificare questa soluzione prima che tutti i progetti sfuggano di mano?ASp.NET MVC - È possibile semplificare la mia architettura?

ok, ecco la mia messa a punto:

DAL - ha collegamenti Entity Framework e metodi per ottenere dati poi convertire i dati ai miei oggetti del modello nello strato modello di

BLL - invia la i dati tornano al modello UI Modello: contiene tutti gli oggetti del modello che vengono utilizzati in tutto il sito, qualsiasi cosa proveniente dal DAL viene convertita in questi oggetti creando un nuovo oggetto e quindi popolando le variabili.

UI - la mia soluzione MVC

Il DAL, BLL e modello sono utilizzati anche da altre soluzioni.

Ora con MVC, sto tentando di utilizzare le annotazioni di convalida ([Obbligatorio], ecc.), Il che significa che devo ricreare gli oggetti del modello con le annotazioni. Questo va bene, ma se voglio salvare i dati nel database ho bisogno di convertire le classi che sono solo disordinate.

Qualcuno può vedere come posso usare la mia attuale libreria di modelli con oggetti modello MVC che usano le annotazioni di validazione?

Se non mi sono spiegato chiaramente, fatemelo sapere e fornirò ulteriori dettagli.

Grazie

risposta

3

Idealmente ci deve essere una separazione dai modelli di dominio da un lato e modelli MVC (sono davvero ViewModels) dall'altro lato. Questa separazione è davvero cruciale e fortemente consigliata.

Questi appariranno molto simili nella maggior parte dei casi sebbene ViewModel possa contenere materiale extra. Quindi è possibile utilizzare AutoMapper per convertire da uno all'altro.

Ad esempio:

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

Salve, appena ricevuto automapper e questo è brillante !!! grazie mille! Ciò consente di risparmiare molte mappe noiose :) – Funky

+0

@Funky sì, è davvero uno strumento utile. – Aliostad

1

si può mettere i metadati in oggetti di metadati senza dover ricreare gli oggetti del modello. Ecco un modo molto semplice per farlo, tuttavia richiede che gli oggetti del modello siano contrassegnati come parziali. Spero che sia OK se non questa soluzione non funzionerà per te.

[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; } 
    } 
} 

nell'esempio precedente c'è un oggetto modello dati denominato PreviousResults creato altrove da un codice di scaffolding. Definisce l'oggetto POCO inviato al e dal database utilizzando LINQ. L'attributo MetadataType indica la classe che verrà utilizzata per contenere i metadati. Quindi devi semplicemente creare oggetti semplici che corrispondono ai nomi dei tuoi dati reali membri e annotarli.

Spero che questo aiuti.

0

È possibile aggiungere perfettamente attributi al BLL (le entità aziendali ). Basta aggiungere un riferimento e aggiungere un'istruzione using per System.ComponentModel.DataAnnotations. Oltre a ciò, è possibile implementare l'interfaccia IValidatableObject (che è piuttosto semplice, vedi sotto).

Per la mappatura, è possibile utilizzare per esempio AutoMapper, quindi non c'è bisogno di scrivere gran parte della logica di mappatura te stesso (se si può sfruttare la magia mappatura nome).

Convalida esempio:

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

return validationErrors; 
Problemi correlati