Jak uczynić witrynę ASP.NET MVC modularną

14

Jestem na etapie planowania budowy intranetu pracowniczego za pomocą ASP.NET MVC 4. Chcielibyśmy, aby witryna składała się z oddzielnych „modułów”, z których każdy ma inną funkcję: wysyłanie wiadomości, zmiany płac itp. Chciałbym, aby te moduły mogły być włączane lub wyłączane podczas kompilacji. Strona główna wyświetli rodzaj nawigacji, która będzie prowadzić do każdego załadowanego modułu.

Jak dotąd jest to łatwe, ale nie chcę, aby funkcja nawigacji musiała wcześniej wiedzieć o modułach. Innymi słowy, chcę, aby moduły były dynamicznie wykrywalne; Chcę mieć możliwość napisania kodu dla nowego modułu, a następnie dodania łącza do paska nawigacji bez żadnych zmian kodu w innym miejscu w źródle. Każdy moduł powinien mieć możliwość zarejestrowania się na pasku nawigacyjnym, a - co ważniejsze - należy to zrobić dla każdego modułu podczas ładowania.

Uważam, że wyklucza to korzystanie z Obszarów MVC, ponieważ są one zaprojektowane na wypadek, gdy układ strony jest znany wcześniej. Wydaje się, że MEF może być odpowiednie, chociaż ludzie mieli mieszane sukcesy w łączeniu MEF z MVC. Czy MEF to tak naprawdę sposób na przejście tutaj, czy też istnieje lepszy sposób na osiągnięcie tego, czego potrzebuję?

bdesham
źródło
Dobre pytanie, mam wrażenie, że twoje rozwiązanie prawdopodobnie będzie się obracać przy użyciu refleksji. Nadal możesz korzystać z obszarów podczas tworzenia przedmiotów, ale twoja metoda budowania menu będzie wymagała użycia refleksji, aby uzyskać wszystkie typy (aby zaoszczędzić ci zmieniającego się kodu). Co jeśli wszystkie zaimplementują ten sam interfejs Interfejs IModule. Następnie możesz znaleźć wszystkie elementy dziedziczące interfejs, aby uzyskać wszystkie moduły, z którymi chcesz się połączyć. Problem polega na tym, jak dokładnie powiążesz to z łączem bez żadnych dodatkowych danych? Hmm, fabuła pogrubia ...
mattytommo
1
Wydaje mi się, że chcesz zbudować CMS, z tą różnicą, że zamiast administrowania systemem CMS z poziomu CMS, chcesz to zrobić w czasie kompilacji. Co prowadzi mnie do pytania, dlaczego chcesz to zrobić w czasie kompilacji?
James P. Wright
@ JamesP.Wright Cóż, powodem, dla którego chciałem to zrobić w czasie kompilacji, było po prostu dlatego, że wydawało się, że byłoby to prostsze niż ujawnienie tej funkcjonalności za pośrednictwem strony w witrynie. (Ponadto zestaw używanych modułów zmienia się tak rzadko, że dodatkowy narzut tego rodzaju dynamicznego wyboru nie jest konieczny.) Ale tak naprawdę ważniejsza niż wybór modułów w czasie kompilacji jest zdolność aplikacji do znalezienia modułów w pierwsze miejsce, które jest raczej sednem mojego pytania.
bdesham
nopCommerce ( nopcommerce.com/documentation.aspx ) jest po części dobrym przykładem tego, czego chcesz. Zobacz, jak napisać wtyczkę i jakie jest ich podejście do DI.
Rui Marques
Dla celów badawczych byłem ciekawy, jaki był „mieszany sukces” w połączeniu MEF z MVC. Ponieważ codeplex to obecnie „Życie w archiwum”, link udostępniony przez OP już nie działa. Oszczędzić kogoś innego czasu: poszukiwania z Ctrl + F „MEF2 z MVC4 poprzez Microsoft.Composition” do dyskusji na języczek archive.codeplex.com/?p=mef ;)
Kevin

Odpowiedzi:

4

Najpierw miałbym scentralizowaną klasę, która służy aplikacji do rejestrowania skompilowanych modułów za pomocą statycznego konstruktora i statycznej składowej Lista modułów, które były w systemie. Moduły miałyby właściwość statyczną wskazującą, czy jest to element menu, czy nie, i w jakiej kolejności powinien pojawić się w menu.

Każdy moduł miałby swojego statycznego konstruktora, który zapisywałby się w scentralizowanej klasie, która śledzi moduły.

Pomyśl o tym systemie bardziej jak o systemie zegara czasu, w którym przychodzą i rejestrują pracownicy. Potem, w czasie płac, wiemy, że płacimy wszystkim pracownikom na podstawie tego, kto się zarejestrował itp.

Refleksji można również użyć, jeśli masz umowę interfejsu dotyczącą modułów, które muszą dziedziczyć po powiązaniu z nią informacji meta właściwości.

Pracowałem dla Warner Brothers Music i zrobiłem wewnętrzny system przetwarzania muzyki dla różnych formatów kodowania. Stworzyłem ogólny model wtyczki do kodowania z odbiciem, który wykorzystywał dziedziczenie, więc może to być typecast z odbiciem, aby uzyskać podstawowe właściwości meta klasy. Jednak nie próbowałem używać statycznej scentralizowanej klasy. Pomyślałem o tym losowo jako o innym sposobie na zabawę.

Dodałbym również, że korzystałem z MVC obsługujących wielu klientów z podstawowym wymaganiem, ale także z ulepszonymi funkcjami podobnymi do tego, co próbujesz zrobić. Zamiast tego przekonwertowałem MVC na użycie App_Code zamiast konieczności kompilacji. Łatwiej jest wypychać pliki w ten sposób bez potrzeby scentralizowanej kompilacji.

Możesz wykorzystać JIT za pomocą zwykłego wypychania FTP lub GIT zamiast konieczności kompilacji lokalnej i wypychania bibliotek DLL.

Oto link do tego artykułu na temat przepełnienia stosu

Jason Sebring
źródło
Brzmi podobnie do tego, co sobie wyobrażałem. Jedynym problemem jest, w jaki sposób mam załadować moduły w pierwszej kolejności? Jakim mechanizmem każe każdemu z nich zarejestrować się w klasie centralnej? To tutaj wydawało się, że MEF może być odpowiednie.
bdesham
MEF jest lepszy. Dałem pomysły, nie zagłębiając się w to, ale skorzystałbym z MEF, biorąc pod uwagę tę opcję, gdyby nie było tego, kiedy robiłem te projekty. To dobry pomysł. Nie rozumiem, dlaczego nie można łączyć MEF i MVC.
Jason Sebring