2012-05-03 3 views
7

Я только начал работать над проектом MVC, и все идет хорошо, но похоже, что я создаю много спагетти-кода с слишком большим количеством объектов. Может ли кто-нибудь увидеть, как я могу упростить это решение до того, как все проекты выйдут из-под контроля?ASp.NET MVC - Можно ли упростить мою архитектуру?

ок, вот мой набор вверх:

DAL - имеет Entity Framework соединения и способы получения данных затем преобразовать данные в моей модели объектов в модельном слое

BLL - посылает данные обратно в UI Model - это содержит все объекты модели, которые используются на всем сайте, все, что приходит из DAL, преобразуется в эти объекты, создавая новый объект, затем заполняя переменные.

UI - мое решение MVC

DAL, BLL и модели также используются другими решениями.

Теперь с MVC, я пытаюсь использовать аннотации проверки ([Обязательно] и т. Д.), Что означает, что я должен повторно создать объекты модели с аннотациями. Это нормально, но если я хочу сохранить данные обратно в базу данных, мне нужно преобразовать классы, которые просто беспорядочны.

Может ли кто-нибудь увидеть, как я могу использовать мою текущую библиотеку классов моделей с объектами модели MVC, использующими аннотации проверки?

Если я не объяснил себя, пожалуйста, сообщите мне, и я предоставлю более подробную информацию.

Благодаря

ответ

3

В идеале должно быть разделение из моделей предметной области, с одной стороны, и модели MVC (они действительно ViewModels) с другой стороны. Это разделение действительно важно и настоятельно рекомендуется.

В большинстве случаев они будут похожи друг на друга, хотя ViewModel может содержать дополнительные материалы. Затем вы можете использовать AutoMapper для конвертации из одного в другой.

Например:

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

Привет, только что получил automapper и это блестящий !!! Огромное спасибо! Это экономит много утомительного отображения :) – Funky

+0

@Funky да, это действительно полезный инструмент. – Aliostad

1

вы можете поместить метаданные объектов метаданных без воссоздания объектов модели. Вот очень простой способ сделать это, однако он требует, чтобы сами объекты модели были отмечены как частичные. Я надеюсь, что все в порядке, если это решение не сработает для вас.

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

в приведенном выше примере есть модель данных объект называется PreviousResults, что создается в другом месте некоторых подмостей кода. Он определяет объект POCO, который отправляется в базу данных и из нее с использованием LINQ. Атрибут MetadataType указывает класс, который будет использоваться для хранения метаданных. Затем вы просто создаете простые объекты, которые соответствуют именам ваших реальных членов данных и аннотируют их.

Надеюсь, это поможет.

0

Вы можете полностью добавить атрибуты к вашему BLL (предприятиям). Просто добавьте ссылку и добавьте оператор using для System.ComponentModel.DataAnnotations. Кроме того, вы можете реализовать интерфейс IValidatableObject (что довольно просто, см. Ниже).

Для сопоставления можно использовать, например, AutoMapper, так что вам не нужно писать в большую часть логики отображения самостоятельно (если вы можете воспользоваться магией отображения имен).

Validate пример:

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

return validationErrors; 
Смежные вопросы