加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 03:19:26 所属栏目:asp.Net 来源:网络整理
导读:我有一个非常棘手的问题需要我解决,我想了很多,然后又找到了一个我要提到的结论. 问题是我有一个客户想要创建一个基于Common功能的网站,所以我们称之为模块,所以我认为使用MVC Contrib Portable Areas,这是插入模块的好主意,但我有一个很大的问题,让我们说我
我有一个非常棘手的问题需要我解决,我想了很多,然后又找到了一个我要提到的结论.
问题是我有一个客户想要创建一个基于Common功能的网站,所以我们称之为模块,所以我认为使用MVC Contrib Portable Areas,这是插入模块的好主意,但我有一个很大的问题,让我们说我创建了一个Blog模块,它将在他想要的新网站中实现,现在一些用户有独特的要求,比如其中一个需要为每篇文章添加图片库,或者每篇文章中的参考列表.
?在正常情况下,如果您有一个站点可以工作,这很容易,所以您需要做的就是

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

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

>如果新功能很酷
并且客户决定实施它
所有网站,然后我必须重复
为每个网站工作.
>如果功能是唯一的,那么将来会给我带来不一致

这就是为什么作为解决问题的第一步,我使用Portable Areas为每个模块创建插件,现在这肯定会通过为每个新模块或插件拖动1个DLL来简化我的工作,但我在这里有一个小问题,

>因为新的模块或Addin是一个
Dll,我怎么能创建这样的
“我的管理”面板中的功能
安装新的Addon或找到任何新的
添加了Module / Addon拖动了新的DLLS
到主要应用程序
>什么是最好的
练习创建一个安装
便携式区域内的程序,
比如更新数据库,新路由等.

现在到模块插件特有的最大问题:)
让我们收回Article Gallery Addon,如果我按照上面提到的逻辑创建它作为Portable区域,在模块代码中创建一个功能以循环遍历所有已安装的插件并在CRUD中列出它会更容易视图,但因为我隔离了插件并且不想手动更新主模块代码的原因上面没有办法对与主模块同步的新插件进行CRUD操作,因为没有外键关系,再次因为我上面说过它可能是可选的,所以我想到了以下解决方案,我希望会有更好的解决方案

首先在安装过程中我将为Gallery Addon创建一个表,但是我将创建一个手动外键,而不是创建外键关系,当我使用创建记录创建记录时,将通过在主模块控制器中生成唯一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();

但这是我的担忧

>这种方式是可行的还是简单的
笨.
>这种技术会不会
生成一个真正独特的密钥.

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读