Як зробити сайт ASP.NET MVC модульним


14

Я перебуваю на стадії планування, щоб система інтрамережі працівника була побудована за допомогою ASP.NET MVC 4. Ми хотіли б, щоб сайт складався з окремих "модулів", кожен з яких надає різні функції: обмін повідомленнями, зміни в оплаті праці тощо. Я хотів би, щоб ці модулі могли бути включені або відключені під час компіляції. На домашній сторінці відображатиметься якась навігація, яка буде посилатися на кожен завантажений модуль.

Це легко поки що, але я не хочу, щоб функція навігації мала знати про модулі заздалегідь. Іншими словами, я хочу, щоб модулі були динамічно відкритими; Я хочу мати змогу написати код для нового модуля, а потім мати посилання, додане до панелі навігації, без зміни коду ніде в джерелі. Кожен модуль повинен мати певний спосіб реєстрації себе за допомогою навігаційної панелі, і - що ще важливіше - це слід робити для кожного модуля під час його завантаження.

Я вважаю, що це виключає використання областей MVC, оскільки вони розроблені для випадку, коли розташування сайту відомо заздалегідь. MEF здається, що це може бути доречним, хоча, здається, люди мали неоднозначний успіх у поєднанні MEF з MVC. Чи справді MEF - це спосіб пройти сюди, чи є кращий спосіб виконати те, що мені потрібно?


Добре запитання, я маю відчуття, що ваше рішення, ймовірно, обертається навколо використання рефлексії. Ви все ще можете використовувати області під час створення елементів, але для вашого методу побудови меню потрібно використовувати відображення, щоб отримати всі ваші типи (щоб заощадити зміну коду). А як бути, якщо всі вони реалізують один і той же інтерфейс IModule. Ви могли б знайти все inheritants інтерфейсу , щоб отримати всі модулі , які необхідно перейти по посиланню, проблема то в тому , як саме ви збираєтеся асоційованим , що з посиланням без яких - або додаткових даних? Гм, сюжет згущується ...
mattytommo

1
Мені здається, що ви хочете створити CMS, за винятком того, що замість того, щоб виконувати адміністрування CMS всередині CMS, ви хочете, щоб це було зроблено під час збирання. Що призводить мене до питання, чому ви хочете, щоб це було зроблено в час збирання?
Джеймс П. Райт

@ JamesP.Wright Ну, причина, що я хотів це зробити під час збирання, був лише тому, що це здавалося, що це буде простіше, ніж відкривати цю функціональність через сторінку на сайті. (Плюс до цього, набір використовуваних модулів змінюватиметься досить рідко, що додаткові накладні витрати такого типу динамічного вибору не потрібні.) Але насправді, більш важливим, ніж вибір модулів у час збирання, є можливість програми знайти модулі в перше місце, що є більш поштовхом мого питання.
бдешам

nopCommerce ( nopcommerce.com/documentation.aspx ) частково є хорошим прикладом, який ви хочете. Погляньте, як написати плагін та їх підхід для DI.
Rui Marques

Для наукових цілей мені було цікаво, що таке «змішаний успіх» у поєднанні MEF з MVC. Оскільки кодексплекс є "Життя в архіві" сьогодні, посилання, яке надала ОП, вже не працює. Щоб заощадити комусь інший час: шукайте за допомогою ctrl + f "MEF2 з MVC4 через Microsoft.Composition" на вкладці дискусій на archive.codeplex.com/?p=mef ;)
Кевін

Відповіді:


4

Я б спершу мав централізований клас, який використовується для програми, щоб реєструвати складені модулі зі статичним конструктором та статичним списком модулів, що були в системі. Модулі матимуть статичну властивість, яка вказує, чи є її пунктом меню чи ні, і який порядок він повинен відображатись у меню.

Кожен модуль мав би свій статичний конструктор, який би відзначав себе в централізованому класі, який відслідковує модулі.

Подумайте про цю систему, як про систему годин, де працівники приходять і працюють. Тоді за час оплати праці ми знаємо, що потрібно сплачувати всім працівникам залежно від того, хто працює в службі тощо.

Відображення також може бути використане, якщо у вас є контракт на інтерфейс для модулів, вони повинні успадковувати цю інформацію про мета властивості, пов'язану з ним.

Я працював у Warner Brothers Music і робив внутрішню систему обробки музики для різних форматів кодування. Я створив загальну модель плагінів для кодування з відображенням, яка використовувала успадкування, щоб його можна було набрати з відображенням, щоб отримати основні мета-властивості класу. Я не намагався використовувати статичний централізований клас. Просто думка про це випадковим чином як інший спосіб спробувати розваги.

Я також додам, що я використовував MVC, що обслуговує декілька клієнтів із базовою вимогою, але також з розширеними функціями, схожими на те, що ви намагаєтеся зробити. Натомість я перетворив MVC у використання App_Code, а не вимагав компіляції. Простіше виштовхувати файли таким чином, не потребуючи централізованої компіляції.

Ви можете використовувати JIT за допомогою простого натискання на FTP або GIT, а не для компіляції локально та натискання DLL навколо.

Ось посилання на цю статтю про переповнення стека


Це звучить схоже на те, що я уявляв. Єдине питання - як я можу завантажувати модулі в першу чергу? За яким механізмом я кажу кожному з них зареєструватися в центральному класі? Ось де MEF здавалося, що це може бути доречним.
бдешам

MEF краще. Я давав ідеї, не дивлячись на це, але я б використав MEF з огляду на цей варіант, якби він не був, коли я робив ці проекти. Здається, гарна ідея. Я не бачу, чому ви не можете поєднувати MEF та MVC.
Джейсон Себрінг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.