Сложный модуль на основе создания новой записи в БД с ASP.NET MVC 2 - PullRequest
5 голосов
/ 16 июля 2010

У меня есть очень сложная проблема, которую я должен решить, и я много думал и искал и пришел к одному выводу, который я упомяну ниже.проблема в том, что у меня есть клиент, который хочет создавать веб-сайты на основе общей функциональности, поэтому давайте назовем его модулями, поэтому я решил использовать переносимые области MVC Contrib, которые являются отличными идеями для подключения модулей, но у меня естьбольшая проблема, скажем, я создал модуль блога, который будет реализован на новом сайте, который он хочет, теперь у некоторых пользователей есть уникальные требования, например, одному из них нужно добавить галерею изображений в каждую статью или список ссылок в каждой статье.это было бы легко в обычной ситуации, когда у вас есть один сайт для работы, поэтому все, что вам нужно сделать, это

  • добавить новую таблицу галереи с внешним ключом в таблицу блогов.
  • восстановить код Linq2SQl и обновить модель.
  • добавить новые элементы формы в Create, Edit, Delete Views.
  • добавить логику в контроллере.

но в моей ситуации это сложно и требует много времени из-за 2 причин

  • если новая функциональность хороша, и клиент решает внедрить ее на всех сайтах, то я должен повторить работу для каждого сайта,
  • если функциональность уникальна, это создаст для меня несогласованность в будущем

, поэтому в качестве первого шага для решения проблемы я использовал Portable Areas для создания дополнений для каждого модуля, теперьэто определенно облегчит мою работу, перетаскивая 1 DLL для каждого нового модуля или аддона, но у меня есть небольшая проблема, которая

  • , потому что новый модуль или аддин является Dll, как я могу создать такойфункция в панели «Мой администратор» для установки нового дополнения или поиска любого нового добавленного модуля / надстройки, перетаскивающего новые DLLS в основное приложение
  • Какова лучшая практика для создания процедуры установки внутри переносимой области, например, обновление базы данных, Новые маршруты и т.д ..

Теперь к самой большой проблеме, которая специфична для модуля Addon :), давайте вернем аддон Gallery Gallery, если я буду следовать логике, упомянутой выше, создавая ее.как переносимая область, было бы легче создать функциональность в модуле Code для циклического прохождения всех установленных аддонови перечислите их в представлениях CRUD, но поскольку я изолировал аддон и не хочу вручную обновлять код основного модуля для указанных выше причин, не будет возможности выполнять операции CRUD для новых аддонов в синхронизации с основным модулем, посколькунет связи с внешним ключом, опять же, потому что, как я сказал выше, она может быть опциональной, поэтому я подумал о следующем решении, которое, я надеюсь, будет лучшим

Сначала в процессе установки я создам таблицу длядополнение к галерее, но вместо создания отношения внешнего ключа я создам внешний ключ вручную, который заполняется генерацией уникального идентификатора в главном контроллере модуля, когда я создаю запись с помощью следующего кода, затем сохраняю ее в ViewData и просто передаюэто к контроллеру аддонов, когда я создаю новую запись,

private  string GenerateId()
 {
  long i = 1;
  foreach (byte b in Guid.NewGuid().ToByteArray())
  {
   i *= ((int)b + 1);
  }
  return string.Format("{0:x}", i - DateTime.Now.Ticks);
 }
ViewData["FK"] = GenerateId();

, но вот мои опасения

  • Это возможно или просто глупо.
  • , этот метод генерирует действительно уникальный ключ.

Мне очень жаль, если мой вопрос хромает, но это лучшее место, чтобы спросить, и я думаю, что многие люди захотятиметь такую ​​функциональность и надеяться, что кто-то ответит мне

1 Ответ

2 голосов
/ 16 июля 2010

Я думаю, это отличный вопрос. Некоторое время назад я начал работать над проектом CMS с использованием MVC1, где я хотел поддерживать плагины. У меня было так, что администратор мог поместить новую сборку плагина в папку bin, и при следующем запуске приложения он сканировал все сборки на наличие IPlugin (или что-то еще) и загружал их. Я встроил частичные виды в сборку плагина, чтобы все было автономно. каждому плагину был присвоен уникальный идентификатор, когда он был размещен на странице, и контроллер плагина знал, как использовать этот идентификатор для запроса своей собственной таблицы (хранилища) для своих данных. основное приложение ничего не знало о схеме плагина.

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

Я не уверен, что это ответ, я просто думаю вслух. надеюсь, это немного поможет обсуждению.

EDIT: для автоматической загрузки плагинов я использовал возможность NInject сканировать сборки на наличие IM-модулей. Мой IPlugin наследуется от Ninject.Modules.INinjectModule, и все плагины реализуют интерфейс IPlugin. Затем при запуске приложения у меня есть следующая строка:

kernel.Load( "*.Plugin.dll" );

где ядро ​​- это Ninject.IKernel, и эта строка будет сканировать любую сборку, соответствующую этому шаблону файла, поэтому я могу добавить сборку, такую ​​как Weather.Plugin.dll.

...