Chcę się upewnić, że przestrzegam standardów branżowych i najlepszych praktyk podczas mojego pierwszego prawdziwego cracku w MVC. W tym przypadku jest to ASP.NET MVC, przy użyciu C #.
Będę używał Entity Framework 4.1 dla mojego modelu z obiektami zawierającymi kod (baza danych już istnieje), więc będzie obiekt DBContext do pobierania danych z bazy danych.
W pokazach, które przeglądałem na stronie asp.net, kontrolery mają w sobie kod dostępu do danych. Nie wydaje mi się to właściwe, szczególnie gdy przestrzegam praktyk DRY (nie powtarzaj się).
Załóżmy na przykład, że piszę aplikację internetową do użytku w bibliotece publicznej i mam kontroler do tworzenia, aktualizowania i usuwania książek w katalogu.
Kilka akcji może wymagać numeru ISBN i trzeba zwrócić obiekt „Book” (pamiętaj, że prawdopodobnie nie jest to w 100% poprawny kod):
public class BookController : Controller
{
LibraryDBContext _db = new LibraryDBContext();
public ActionResult Details(String ISBNtoGet)
{
Book currentBook = _db.Books.Single(b => b.ISBN == ISBNtoGet);
return View(currentBook);
}
public ActionResult Edit(String ISBNtoGet)
{
Book currentBook = _db.Books.Single(b => b.ISBN == ISBNtoGet);
return View(currentBook);
}
}
Zamiast tego, czy rzeczywiście powinienem mieć metodę w obiekcie kontekstu db, aby zwrócić jedną książkę? Wydaje mi się, że jest to dla mnie lepsze oddzielenie i pomaga promować DRY, ponieważ może być konieczne uzyskanie obiektu Book przez ISBN gdzie indziej w mojej aplikacji internetowej.
public partial class LibraryDBContext: DBContext
{
public Book GetBookByISBN(String ISBNtoGet)
{
return Books.Single(b => b.ISBN == ISBNtoGet);
}
}
public class BookController : Controller
{
LibraryDBContext _db = new LibraryDBContext();
public ActionResult Details(String ISBNtoGet)
{
return View(_db.GetBookByISBN(ISBNtoGet));
}
public ActionResult Edit(ByVal ISBNtoGet as String)
{
return View(_db.GetBookByISBN(ISBNtoGet));
}
}
Czy to prawidłowy zestaw zasad, których należy przestrzegać przy kodowaniu mojej aplikacji?
Albo, jak sądzę, bardziej subiektywne pytanie brzmiałoby: „czy to właściwy sposób, aby to zrobić?”
źródło
W ten sposób to robię, chociaż wstrzykuję dostawcy danych jako ogólny interfejs usługi danych, aby móc zamienić implementacje.
O ile mi wiadomo, kontroler ma być miejscem, w którym uzyskujesz dane, wykonujesz dowolne czynności i przekazujesz dane do widoku.
źródło