Професионална програма
Loading...
+ Нов въпрос
VenelinGrozev avatar VenelinGrozev 130 Точки

[Homework} Binding models

Здравейте,

Докато решавам днес задачите от домашното изникна следният въпрос - трябва ли binding моделите да бъдат направени отделно от моделите, които ползваме в EF проекта?

В конкретният случай имам solution в който имам следните проекти

BookShopSystem.Models

--Author.cs

 

--Book.cs

...

BookShopWebApplication

--Models

----IdentityModels.cs

...

За binding модел ползвам моделите от BookShopSystem.Models. Трябва ли да ги създам и папката Models на BookShopWebApplication проекта?

Тагове:
0
Advanced Level: Back-End 16/08/2015 15:20:37
vladislav.karamfilov avatar vladislav.karamfilov 1123 Точки

По-добре си отдели един проект за binding моделите (те в своята същност са DTO-та). В твоя случай може да добавиш един проект BookShopSystem.Dto. 

Също така, ако си в авантюристично настроение, можеш да разгледаш библиотеката AutoMapper, която може да използваш за създаване на обекти от моделите за базата данни към DTO и обратно. :)

2
a_rusenov avatar a_rusenov 1103 Точки

Добре е да имаш отделни класове за binding модели. Например истинският ти модел за пост е:

public class Post
{
  [Key]
  public int Id { get; set; }

  [Required]
  public User Author { get; set; }

  public DateTime PostedOn { get; set; }
  
  [Required]
  public string Content { get; set; }
}

Обаче за да добавиш пост подаваш само Content. Ако ползваш оригиналния модел, при проверката if (this.ModelState.IsValid) няма да мине, понеже Author не е бил подаден в заявката (а е Required). Също така DateTime PostedOn не би трябвало да се подава, той се взима server-side.

Затова в Services проекта в Models правим АddPostBindingModel клас само с нещата, които получава в заявката:

public class AddPostBindingModel
{
  [Required]
  public string Content { get; set; }
}
3
16/08/2015 20:02:36
VenelinGrozev avatar VenelinGrozev 130 Точки

Ок, благодаря и на двама ви. Най-интересното е, че валидацията с оригиналния EF модел минава без грешки, въпреки че липсва id. Имам предвид конкретно при класа на автора

public class Author
    {
        private ICollection<Book> books;

        public Author()
        {
            this.books = new HashSet<Book>();
        }

        [Key]
        public int Id { get; set; }

        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        public virtual ICollection<Book> Books
        {
            get { return this.books; }
            set { this.books = value; }
        }
    }

 

0
a_rusenov avatar a_rusenov 1103 Точки

Прав си, когато не се подаде изрично, id-то просто дефолтва (int до 0 или string до null). Поправих си примера.

Попринцип правилото е binding моделът да пази само данните, които получаваме от заявката. Отделно решава следните проблеми:

  • Данните от заявката не се мапват до пропъртито (например праща се text вместо content - в такъв случай правим binding model с пропърти Text)
  • Някои неща от оригиналния модел са задължителни, но не ги получаваме от заявката (например авторът при добавяне на пост - него го взимаме чрез access_token от хедърите, не от body-то)
  • Трябват ни допълнителни валидации, но не искаме да пипаме по DB моделите
1
16/08/2015 20:03:24