MVC wdrażanie EF

0

Witam,

Mam nietypowy problem, pisze pracę inżynierską i dopiero wchodzę z zagadnienie mvc + EF, mój problem polega na tym że chcą dobrze powiązać te dwa światy i moje pytanie może jest banalne jednak kilka książek zmotało mi nieco głowę.

  1. Jak prawidłowo połączyć mvc+EF gdy mam w Sql Server gotowe tabele jednak, zauważyłem że w jednych miejscach tworzą osobną klasę z DbSet i listami rzutując je na klasy gotowe w aplikacji tabel i obiekt dziedziczy po DbContext (jednak czy to ma sens w przypadku gdy sql server ma już gotowe tabele ponieważ czytając pewną książkę odwiedziłem się ze to się stosuje w przypadku aby EF automatycznie sam wygenerował sobie tabele w bazię)

  2. Czy po prostu wystarczy stworzyć sam obiekt importując tabele i procedury bez żadnej klasy z DbContext i po prostu w każdym kontrolerze tworzyć nowy obiekt entity i na nim robić operację?

  3. gdy już rozwiążę powyższy problem zauważyłem że aby łatwo zmienić dostawcę w aplikacji np z EF na XML model mvc oddziela każdy element aby nie był uzależniony od żadnego innego więc generując każdy kontroler i odczytując dane to korzystam właśnie z obiektu EF a gdy chciałbym np nagle zmienić dostawce muszę przekopać wszystkie kontrolery, jednak gdzieś znalazłem sposób na wstrzykniecie konstruktora przez interfejs bądź wykorzystanie do tego celu biblioteki Ninject jak to się ma w praktyce i jak to wykonać prawidłowo (chodzi o to że aplikacja musi być łatwo rozszerzalna dlatego szukam najlepszych metod do tego celu ponieważ nie każda książka uwzględnia wszystkie aspekty mojej aplikacji a w internecie jest dużo pomysłów i każdy inny, co do pomocy promotora, jednak wole poczekać i spróbować najpierw zasięgnąć porady tutaj)

Liczę na wyrozumiałość gdyż jestem tylko człowiekiem ;)
Z góry dziękuję za pomoc!

0

"łatwo zmienić dostawcę w aplikacji np z EF na XML " - nie tak łatwo, bo co zrobisz jeżeli np. EF korzysta z procedur przechowywanych do zwracania pewnych wyników zapytań lub w widokach wykorzystywane są funkcje SQL zdefiniowane przez użytkownika. To może być łatwe jak korzystasz tylko i wyłącznie z tabel, ale ja osobiście staram się ze względu na wydajność jak najwięcej danych przetwarzać po stronie serwera SQL

0

A ty w jaki sposób korzystasz z EF, tworzysz obiekt w każdym kontrolerze? i odwolujesz sie bezpośrednio do niego za pomocą linq tak?

2
jawka7 napisał(a):
  1. Jak prawidłowo połączyć mvc+EF gdy mam w Sql Server gotowe tabele jednak, zauważyłem że w jednych miejscach tworzą osobną klasę z DbSet i listami rzutując je na klasy gotowe w aplikacji tabel i obiekt dziedziczy po DbContext (jednak czy to ma sens w przypadku gdy sql server ma już gotowe tabele ponieważ czytając pewną książkę odwiedziłem się ze to się stosuje w przypadku aby EF automatycznie sam wygenerował sobie tabele w bazię)

  2. Czy po prostu wystarczy stworzyć sam obiekt importując tabele i procedury bez żadnej klasy z DbContext i po prostu w każdym kontrolerze tworzyć nowy obiekt entity i na nim robić operację?

Skoro masz gotowe tabele, to dodajesz do projektu "ADO.NET Entity Data Model", podajesz connection stringa, zaznaczasz które tabele chcesz mieć w modelu i tyle.
W efekcie dostajesz klasę swojego modelu dziedziczącą po ObjectContext oraz zestaw klas zmapowanych na tabele BD.

  1. gdy już rozwiążę powyższy problem zauważyłem że aby łatwo zmienić dostawcę w aplikacji np z EF na XML model mvc oddziela każdy element aby nie był uzależniony od żadnego innego więc generując każdy kontroler i odczytując dane to korzystam właśnie z obiektu EF a gdy chciałbym np nagle zmienić dostawce muszę przekopać wszystkie kontrolery,

Kontrolery nie powinny nic wiedzieć o bazie danych ani o żadnym obiekcie EF. Powinieneś mieć oddzielne klasy realizujące logikę biznesową (te klasy nazwijmy serwisami aplikacyjnymi) Twojej aplikacji, kontrolery zaś wykonywałyby operacje na metodach tych klas.
Ponadto, skoro zakładasz możliwość zmiany źródła danych, to powinieneś opakować jakoś dostęp do nich, np. stosując wzorzec Repozytorium. Stworzysz dwa konkretne repozytoria: jedno korzystające z EF, drugie z XML, a serwisy aplikacyjne korzystać będą z tego repozytorium, które im wskażesz. Podmiana jednego na drugie to będzie tylko jedno miejsce w kodzie.

jednak gdzieś znalazłem sposób na wstrzykniecie konstruktora przez interfejs

A nie czasem interfejsu przez konstruktor?

bądź wykorzystanie do tego celu biblioteki Ninject jak to się ma w praktyce i jak to wykonać prawidłowo

Jak najbardziej powinieneś użyć Ninject, albo jakiegoś innego kontenera IoC do zarządzania obiektami w systemie.
Prawidłowo - trzeba po pierwsze skonfigurować Ninjecta, po drugie napisać wszystkie klasy tak, aby Ninject mógł im wstrzykiwać instancje innych klas.
Np. ProductController w konstruktorze przyjmuje obiekt typu IProductsService, który z kolei przyjmuje w konstruktorze IProductsRepository.

(chodzi o to że aplikacja musi być łatwo rozszerzalna dlatego szukam najlepszych metod do tego celu ponieważ nie każda książka uwzględnia wszystkie aspekty mojej aplikacji a w internecie jest dużo pomysłów i każdy inny, co do pomocy promotora, jednak wole poczekać i spróbować najpierw zasięgnąć porady tutaj)

Zastosowanie podziału na warstwy i separacja logiki biznesowej od źródła danych przez repozytorium znacznie ułatwia rozszerzalność w porównaniu z pisaniem wszystkiego w kontrolerach.

Liczę na wyrozumiałość gdyż jestem tylko człowiekiem ;)
Z góry dziękuję za pomoc!</quote>

cw napisał(a):

"łatwo zmienić dostawcę w aplikacji np z EF na XML " - nie tak łatwo, bo co zrobisz jeżeli np. EF korzysta z procedur przechowywanych do zwracania pewnych wyników zapytań lub w widokach wykorzystywane są funkcje SQL zdefiniowane przez użytkownika. To może być łatwe jak korzystasz tylko i wyłącznie z tabel, ale ja osobiście staram się ze względu na wydajność jak najwięcej danych przetwarzać po stronie serwera SQL

Dlatego w takim przypadku trzeba wprowadzić dodatkową warstwę abstrakcji, żeby aplikacja nie martwiła się o to, czy ma bazę SQL z procedurami, czy plik tekstowy z ogonkami.

0

ok już wszystko rozumiem, podobnie myślałem jednak potrzebowałem kogoś kto naprowadzi mnie dokładniej na tą drogę ponieważ w internecie cieżko o dobre materiały na ten temat a każda książka inaczej podchodzi do tematu, dzieki wielkie

0

Skoro już o książkach wspomniałeś, mogę w tym temacie polecić:
http://helion.pl/ksiazki/asp-net-mvc-3-framework-zaawansowane-programowanie-steven-sanderson-adam-freeman,aspmv3.htm

Generalnie jest to podręcznik mvc3, ale dość dobrze opisuje wzorzec DI+repozytorium (właśnie z wykorzystaniem Ninject).

0

No właśnie mam ta książkę tylko w wydaniu 4 lecz mogłoby być więcej przykładów podejrzewam ze w poprzednim wydaniu było coś więcej na ten temat, no ale trudno.
Może uda się pobrać jakiś pdf.

Dzięki wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1