我有一个非常棘手的问题让我解决,我想了很多,然后找到了一个我要提到的结论。 问题是我有一个客户想要创建一个基于Common功能的网站,所以我们称之为模块,所以我想的是使用MVC Contrib Portable Areas,这是插入模块的好主意,但我有一个很大的问题,让我们说我创建了一个Blog模块,它将在他想要的新网站中实现,现在一些用户有独特的要求,比如其中一个需要为每篇文章添加图片库,或每篇文章中的参考列表。 在正常情况下,如果您有一个工作站点,这将很容易,所以您需要做的就是
但在我的情况下,由于两个原因,它很复杂且时间繁琐
这就是为什么作为解决问题的第一步,我使用Portable Areas为每个模块创建插件,现在这肯定会通过为每个新模块或插件拖动1个DLL来简化我的工作,但我在这里有一点问题,这
现在解决Module Addon特有的最大问题:) 让我们收回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();
但这是我的担忧
如果我的问题很蹩脚,我感到非常抱歉,但这是最好的问题,我想很多人都希望有这样的功能,希望有人能回答我
答案 0 :(得分:2)
我认为这是一个很好的问题。前一段时间我开始使用MVC1开发一个CMS项目,我想支持插件。我有它的工作,以便管理员可以将新的插件程序集放入bin文件夹,然后下一个应用程序启动,它将扫描所有程序集的IPlugin(或其他)并加载它们。我将部分视图嵌入到插件程序集中,因此它都是自包含的。当每个插件放在页面上时,每个插件都被赋予一个唯一的标识符,插件的控制器知道如何使用该ID来查询它自己的表(存储库)以获取它的数据。主应用程序对插件的架构一无所知。
这里唯一的区别是,听起来你会在同一个数据库上运行多个网站,你需要区分每个网站所需的插件实例。我假设的地方你已经有了表明它是哪个网站,可能通过外键来选择仅适用于该网站的网页插件的用户是。关键
我不确定这是否是一个答案,我只是在大声思考。希望它能帮助讨论一点。
编辑:为了自动加载插件,我使用了NInject的能力来扫描IModules的程序集。我的IPlugin继承自Ninject.Modules.INinjectModule
,所有插件都实现了IPlugin接口。然后在应用启动时,我有以下一行:
kernel.Load( "*.Plugin.dll" );
其中kernel是Ninject.IKernel,该行将扫描与该文件模式匹配的任何程序集,因此我可以放入像Weather.Plugin.dll这样的程序集。