基于复杂模块使用ASP.NET MVC 2在DB中创建新记录

Dev*_*nia 5 asp.net-mvc portable-areas

我有一个非常棘手的问题需要我解决,我想了很多,然后又找到了一个我要提到的结论.问题是我有一个希望创建一个基于通用功能的网站,让我们叫它模块,所以我以为是使用MVC的Contrib便携式领域,这是伟大的想法,将模块客户端,但我有一个很大的问题,让我们说我创建了一个Blog模块,它将在他想要的新网站中实现,现在一些用户有独特的要求,比如其中一个需要为每篇文章添加图片库,或者每篇文章中的参考列表.在正常情况下,如果您有一个站点可以工作,这很容易,所以您需要做的就是

  • 将具有外键的新图库表添加到Blog表.
  • 重新生成Linq2SQl代码并更新模型.
  • 将新表单元素添加到"创建","编辑","删除视图".
  • 在控制器中添加逻辑.

但在我的情况下,由于两个原因,它很复杂,而且时间繁琐

  • 如果新功能很酷并且客户决定在所有站点中实现它,那么我必须重复每个站点的工作.
  • 如果功能是唯一的,那么将来会给我带来不一致

这就是为什么作为第一步解决我使用的便携式领域创造附加组件为每个模块,现在这肯定会通过拖动1个DLL为每个新的模块或附加组件减轻我的工作,这个问题,但我在这里有一个小问题,

  • 因为新的模块或Addin是一个Dll,我怎么能在My Admin面板中创建这样的功能来安装新的Addon或者找到任何新添加的Module/Addon拖动的新DLLS到主应用程序
  • 在便携式区域内创建安装过程的最佳做法是什么,例如更新数据库,新路由等.

我们这是特定的模块附加组件的最大问题:)让我们回条画廊插件,如果我按照我已经通过创建它作为一个便携式区域上面提到的逻辑,它会更容易在模块来创建一个功能通过所有已安装附加组件代码回路,并列出它们在CRUD意见,但因为我孤立附加组件,不想手动更新主模块代码由于上述原因会有没有办法做CRUD操作的新的附加组件与主模块同步,因为没有外键关系,再次因为如上所述它可能是可选的,所以我想到了以下解决方案,我希望有一个更好的解决方案

首先,在安装过程中,我创建画廊附加组件一个表,但不是创建一个外键关系,我将创建一个手动外键,这将通过生成的主模块控制器一个唯一的ID,当我通过创建记录获取填充下面的代码然后将它存储在ViewData中,并在创建新记录时将其传递给Addon Controller,

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();
Run Code Online (Sandbox Code Playgroud)

但这是我的担忧

  • 这种方式是可行还是只是简单的愚蠢.
  • 这种技术会生成一个真正独特的密钥.

如果我的问题很蹩脚,我感到非常抱歉,但这是最好的问题,我想很多人都希望有这样的功能,希望有人能回答我

dav*_*ben 2

我认为这是一个很好的问题。不久前,我开始使用 MVC1 开发一个 CMS 项目,我想在其中支持插件。我让它工作,以便管理员可以将新的插件程序集放入 bin 文件夹中,下一个应用程序启动时,它将扫描所有程序集以查找 IPlugin (或其他)并加载它们。我将部分视图嵌入到插件程序集中,因此它是独立的。每个插件在放置在页面上时都会被赋予一个唯一的标识符,并且插件的控制器知道如何使用该 ID 来查询其自己的表(存储库)中的数据。主应用程序对插件的架构一无所知。

这里唯一的区别是,听起来您将在同一个数据库上运行多个网站,并且您需要区分每个网站所需的插件实例。我假设在某个地方你有一个键来指示它是哪个网站,可以通过外键使用它来仅选择用户所在页面的该网站的插件。

我不确定这是否是一个答案,我只是在大声思考。希望对讨论有一点帮助。

编辑:为了自动加载插件,我使用 NInject 的功能来扫描 IModule 的程序集。我的IPlugin继承自Ninject.Modules.INinjectModule,所有插件都实现了IPlugin接口。然后在应用程序启动时,我有以下行:

kernel.Load( "*.Plugin.dll" );
Run Code Online (Sandbox Code Playgroud)

其中内核是 Ninject.IKernel,该行将扫描与该文件模式匹配的任何程序集,因此我可以放入像 Weather.Plugin.dll 这样的程序集。