10

Obecnie pracuję nad tym, jak zrestrukturyzować architekturę istniejącej, niezbyt modułowej aplikacji ASP.NET MVC 3.0. Mam na uwadze strukturę podobną do wtyczki, aby rozbudować istniejący projekt.Najlepsze praktyki dotyczące złożonych aplikacji internetowych ASP.NET MVC (MEF, obszary, DI)

Szukałem różnych strategii tworzenia modularnych aplikacji internetowych i znalazłem następujące. Chciałbym, abyś skomentował te pomysły.

  • Obszarów MVC w oddzielnych projektów

Dla każdej wtyczki Chcę stworzyć indywidualny projekt ASP.NET MVC, który zawiera kontrolery, widoki i przeglądać modele dla wtyczki. Moduł "Pracownik" zawierałby pole do listy, tworzenia, aktualizowania i usuwania pracowników. Jednak brzmi to dobrze, funkcja AreaRegistration jest wymagana do umieszczenia wszystkich obszarów w katalogu "bin". Znalazłem sposób, aby umieścić moje projekty palących bezpośrednio w folderze pomieszczeniach i rozwiązywać zespoły palących od „/ regiony/[AreaName]/bin” folderu:

BuildManager.AddReferencedAssembly.Add(Assembly.LoadFrom(…)); 
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies; 

To działa całkiem dobrze i pozwala mi wdrożyć wtyczki w folderze Obszary głównego projektu. Podoba mi się, że używam funkcji Obszary, które są dostarczane z pudełka przez ASP.NET MVC.

  • MVC przenośne obszarach (MvcContrib)

http://elegantcode.com/2012/04/06/mvc-portable-areas/

Obszary przenośne nie wydają się być dobre podejście, ponieważ wymagają one, że poglądy są kompilowane jako wbudowanych zasobów w projekcie Area plik. Zapobiegłoby to buforowaniu IIS. Z drugiej strony nie potrafię sobie wyobrazić, jak duży jest problem z wydajnością.

  • Moduły MVC oparte użyciem MEF

http://www.fidelitydesign.net/?p=104

W celu stworzenia luźno powiązanych usług w innych projektach ja mocno polegają na MEF. W związku z tym pomyślałem, że będzie to świetny pomysł, aby go użyć, aby odkryć moduły/wtyczki ASP.NET MVC. W efekcie użyłbym ControllerFactory, który miałby utworzyć instancje Controllersów eksportowanych przy użyciu atrybutu "Export". W ten sposób miałbym pełną kontrolę nad tworzeniem wtyczek i mogłem używać MEF do uzyskiwania usług. Jednak używanie MEF naprawdę wymaga znacznie więcej pracy niż korzystanie z obszarów MVC, które rozwiązują kontrolery po wyjęciu z pudełka.

  • Entity Framework całej Plugin projektów

Jeden problem, byłem w stanie rozwiązać tak daleko, jak jest do dystrybucji jednostek w poprzek poszczególnych projektów wtyczki. Obecnie stosujemy podejście Database First, które składa się z jednego pliku modelu * .edmx, który zawiera wszystkie elementy. Nawet z DbContext lub Code First nie można używać wielu klas DbContext dla jednej bazy danych. Jednym z pomysłów byłoby użycie MEF do ładowania elementów z różnych wtyczek do centralnej klasy DbContext. Jednak nie wiem, czy jest to obsługiwana i/lub zalecana konfiguracja.

Odpowiedz

3

Inną opcją jest użycie mojego Griffin.MvcContrib. Dba o Twoją hydraulikę i pozwala pisać widoki oraz korzystać z obszarów z niewielkimi zmianami kodu.

Użyj go razem z kontenerem IoC, aby uzyskać potężny system wtyczek.

Oto artykuł, który pokazuje, jak: http://www.codeproject.com/Articles/386674/ASP-NET-MVC-3-plug-in-architecture-using-Griffin-M

+0

Dziękuję za wskazanie mi do projektu Griffin.MvcContrib. Wygląda świetnie! Ostatnie pytanie: Jak współdzielić jednostki za pomocą Entity Framework pomiędzy wtyczkami? Czy wszystkie obiekty muszą znajdować się w ramach jednego projektu warstwy danych? – Toni

+0

Nie współużytkuję elementów EF (zwykle odejmuję źródło danych za pomocą narzędzia odwzorowującego między obiektami bazy danych a obiektami biznesowymi), ale umieszczam wspólne obiekty w oddzielnym projekcie – jgauffin

+0

Ale czy nie wymaga tego duplikat kodu, ponieważ Klasy elementów EF i moje klasy domeny są w zasadzie takie same? Ponadto nie mogę odpowiadać na klasy domen, ponieważ nie implementują one 'IQueryable'. – Toni

Powiązane problemy