Сложный модуль на основе создания новой записи в БД с помощью ASP.NET MVC 2

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

  • добавьте новую таблицу галереи с внешним ключом в таблицу Blog.
  • повторно сгенерируйте код Linq2SQl и обновите модель.
  • добавить новые элементы формы в представления «Создать», «Редактировать», «Удалить».
  • добавить логику в контроллер.

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

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

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

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

Теперь к самой большой проблеме, которая характерна для аддона модуля :) давайте вернем аддон галереи статей, если я буду следовать логике, которую я упомянул выше, создав ее как переносимую область, было бы проще создать функциональность в модуле Код для перебора всех установленных надстроек и перечисления их в представлениях 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();

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

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

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


person DevMania    schedule 16.07.2010    source источник
comment
Это вовсе не глупый вопрос, а это вопрос дизайна, требующий немного размышлений. Однако я не думаю, что дизайн вашей базы данных должен когда-либо требовать от вас создания собственных идентификаторов. Я считаю, что вам нужна таблица, содержащая всю информацию о ваших плагинах (если это то, что вы делаете), с дополнительным столбцом, чтобы отличать плагины друг от друга. Это позволит вам использовать одну и ту же схему Linq to SQL для всех подключаемых модулей. Если для конкретного подключаемого модуля имеется уникальная информация, вы можете создать отдельную схему Linq to SQL для уникальной информации этого подключаемого модуля.   -  person Robert Harvey    schedule 16.07.2010
comment
Отдельная схема Linq to SQL может работать с подключаемым модулем, поэтому вам не требуется обновлять основную схему Linq to SQL каждый раз, когда вы добавляете подключаемый модуль с уникальной информацией. Это лишь один из многих возможных способов решения проблемы.   -  person Robert Harvey    schedule 16.07.2010
comment
спасибо, ребята, но не могли бы вы сказать мне, что именно я должен включить в схему плагина, только таблицы плагинов? еще одна проблема, которая все еще существует, заключается в том, как я могу связать недавно вставленную запись с плагинами, это так, как я упомянул, или есть лучший способ?   -  person DevMania    schedule 16.07.2010


Ответы (1)


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

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

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

РЕДАКТИРОВАТЬ: для автоматической загрузки плагинов я использовал возможность NInject сканировать сборки на наличие IModules. Мой IPlugin наследуется от Ninject.Modules.INinjectModule, и все плагины реализуют интерфейс IPlugin. Затем при запуске приложения у меня есть следующая строка:

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

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

person Dave Thieben    schedule 16.07.2010
comment
спасибо за продумывание нагрузки, на самом деле я хочу сделать то же самое, что и вы, сайты не работают на одной центральной БД, я имел в виду, что основная схема БД будет повторяться на каждом сайте, моя проблема в том, что я хочу те плагины, которые не имеют сильного отношения к внешнему ключу, чтобы получить идентификатор недавно вставленной статьи основного блога, например, чтобы я мог соединить их вместе, когда я запрашиваю, и я, похоже, не могу найти другую вещь, вы можете сказать мне, как вы ищете эти новые сборки, я имею в виду, что любой небольшой код поможет :) - person DevMania; 16.07.2010
comment
обновил мой ответ с кодом сканирования. Я не уверен, что вы подразумеваете под соединением их вместе, когда я запрашиваю. не могли бы вы сказать мне, что вы пытаетесь сделать? - person Dave Thieben; 16.07.2010
comment
keeol man, что я имел в виду, когда запрашивал их, так это то, что если вы читали мой вопрос выше, я упомянул, что у меня будет базовый модуль блога и, возможно, новый аддон (плагин), который позволит вам добавлять изображения в статью, теперь мой Проблема, как я уже упоминал, заключается в том, что когда я вставляю новую статью, я могу получить ее идентификатор и сделать ее внешним ключом в плагине галереи, поэтому, когда я хочу показать статью, я могу присоединиться к запросу Таблица статей + Таблица плагинов галереи, в основном моя проблема заключается в том, что когда я нажимаю «Сохранить», мне нужен механизм, который получит новый идентификатор статьи и передаст его, например, для рендеринга действия. - person DevMania; 17.07.2010
comment
Ага. хорошо, вам понадобится какая-то таблица для сопоставления ваших статей с их плагинами, используя идентификатор статьи и уникальный идентификатор, который вы создаете. вам также может понадобиться сохранить тип (полное имя типа) плагина, для которого предназначен идентификатор. затем, когда у вас есть запрос на загрузку статьи, вы можете узнать, какие плагины должны быть на этой странице, и вытащить их из базы данных. когда вы добавляете плагин в статью, вам нужно будет передать идентификатор статьи в действие добавления, чтобы его можно было сохранить в этой таблице сопоставления. - person Dave Thieben; 17.07.2010
comment
Я думаю, что в дополнение к интерфейсу IPlugin также может быть необходимо иметь что-то вроде интерфейса IPluginRepository, который определен в вашей сборке плагинов, чтобы статья могла создавать его экземпляры и запрашивать их для плагинов с учетом идентификатора статьи. потому что каждый плагин может иметь свою собственную схему и/или механизм сохранения. - person Dave Thieben; 17.07.2010
comment
Большое спасибо за идеи, чувак, но мне все еще трудно реализовать это, я имею в виду, что вот пример, страница создания статьи есть, и внутри формы я использую renderaction для загрузки плагина, теперь, когда я нажимаю кнопку кнопка сохранения, MVC сначала вставит статью, а затем передаст идентификатор любому плагину, затем в каждом плагине вы начнете сохранять логику БД с переданным идентификатором, я говорю это, потому что при отправке формы ничего из этого не произойдет в очереди - person DevMania; 17.07.2010
comment
убедитесь, что соответствующие параметры для выбранного плагина являются частью формы ввода формы, например, скрыты в полях ввода. например, когда пользователь добавляет плагин галереи, вам, вероятно, потребуется установить имя класса плагина в скрытом виде и указать папку для изображений, которые выбирает пользователь. затем, когда форма отправлена, эти значения доступны в вашем действии создания статьи. в своем действии сначала сохраните статью, чтобы получить идентификатор статьи, затем делегируйте сохранение плагину и передайте идентификатор статьи. - person Dave Thieben; 17.07.2010
comment
прекрасный человек, я сделал все шаги, которые вы упомянули, но глупый вопрос, который я задавал уже давно :), в MVC, как я могу делегировать сохранение плагина? - person DevMania; 17.07.2010
comment
это будет либо интерфейс IPlugin, либо IPluginRepository, если он у вас есть. действие создания статьи сохранит статью, а затем загрузит плагины, выбранные на основе имени класса в вашем скрытом поле ввода, а затем вызовет plugin.Save(articleId) или что-то еще. - person Dave Thieben; 18.07.2010
comment
Великолепный человек, только когда я отправляю форму и если модель статьи действительна, проверка модели плагина с использованием RenderAction не достигается, только если модель статьи недействительна, я обнаружил это с помощью отладки - person DevMania; 18.07.2010
comment
тот, о котором я не знаю. возможно, вам придется опубликовать это как отдельный вопрос. удачи. - person Dave Thieben; 18.07.2010