我有一个非常棘手的问题要解决,我思考和搜索了很多,得出了一个我会提到的结论。
问题是我有一个客户想要创建一个基于通用功能的网站,所以我们称之为模块,所以我想使用 MVC Contrib Portable Areas,这是插入模块的好主意,但我有一个大问题,假设我创建了一个博客模块,该模块将在他想要的新站点中实现,现在一些用户有独特的要求,比如其中一个需要为每篇文章添加图片库,或者每篇文章中的引用列表。
在正常情况下,如果您有一个站点可以工作,这很容易,所以您所要做的就是
但在我的情况下,由于两个原因,它既复杂又耗时
和客户决定在
所有网站,然后我必须重复
为每个站点工作。
这就是为什么作为解决问题的第一步,我使用可移植区域为每个模块创建插件,现在这肯定会通过为每个新模块或插件拖动 1 个 DLL 来简化我的工作,但我在这里有一个小问题,
dll,我怎样才能创建这样一个
我的管理面板中的功能
安装新的插件或找到任何新的
添加了模块/插件拖动了新的 DLLS
转到主应用程序
练习创建安装
可移植区域内的程序,
比如更新数据库、新路由等。
现在是模块插件特有的最大问题:)
让我们收回文章库插件,如果我按照上面提到的逻辑将它创建为可移植区域,那么在模块代码中创建一个功能来循环所有已安装的插件并将它们列在 CRUD 中会更容易 View ,但是由于我隔离了插件并且由于上述原因不想手动更新主模块代码,因此无法对与主模块同步的新插件进行 CRUD 操作,因为没有外键关系,再次因为正如我上面所说的它可能是可选的,所以我想到了以下解决方案,我希望会有更好的解决方案
首先在安装过程中,我将为 Gallery Addon 创建一个表,但不是创建外键关系,而是创建一个手动外键,当我使用创建记录时,将通过在主模块 Controller 中生成唯一 ID 来填充以下代码然后将其存储在 ViewData 中,并在我创建新记录时将其传递给插件 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();
但这是我的担忧
愚蠢的。
生成真正唯一的 key 。
如果我的问题很蹩脚,我非常抱歉,但这是最好的提问地方,我想很多人都希望有这样的功能,希望有人能回答我
最佳答案
我认为这是一个很好的问题。不久前,我开始使用 MVC1 开发一个 CMS 项目,我想在其中支持插件。我让它工作,以便管理员可以将一个新的插件程序集放入 bin 文件夹中,然后下一个应用程序启动,它将扫描所有程序集以查找 IPlugin(或其他)并加载它们。我将部分 View 嵌入到插件程序集中,所以它都是自包含的。每个插件在放置在页面上时都会被赋予一个唯一标识符,并且插件的 Controller 知道如何使用该 ID 来查询它自己的表(存储库)中的数据。主应用程序对插件的架构一无所知。
这里唯一的区别是听起来您将在同一个数据库上运行多个网站,并且您需要区分每个网站需要哪些插件实例。我假设您在某个地方有一个键,该键指示它是哪个网站,可以通过外键使用该键仅为用户所在页面选择该网站的插件。
我不确定这是否是一个答案,我只是在大声思考。希望对讨论有所帮助。
编辑:为了自动加载插件,我使用了 NInject 扫描组件以查找 IModules 的能力。我的 IPlugin 继承自 Ninject.Modules.INinjectModule
, 所有插件都实现了 IPlugin 接口(interface)。然后在应用程序启动时,我有以下行:
kernel.Load( "*.Plugin.dll" );
其中 kernel 是 Ninject.IKernel 并且该行将扫描与该文件模式匹配的任何程序集,因此我可以放入像 Weather.Plugin.dll 这样的程序集。
关于asp.net-mvc - 基于复杂模块的使用 ASP.NET MVC 2 在数据库中创建新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261403/