博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CJCMS系列---说说项目中的插件思想(1)
阅读量:5147 次
发布时间:2019-06-13

本文共 6212 字,大约阅读时间需要 20 分钟。

  目前项目的架构基本趋势都是易扩展,易扩展主要的实现方式就是插件,在项目中所有的扩展模块都看作为是一个插件,那最为主要的就是插件与母体如何结合起来的,接下来就来讨论一下,我对于插件项目的理解和实现。同时由于本人能力有限,问题会很多,请大家批评指正。

 

  我认为插件就是就是一个单独的项目,到最后整合到一个母项目中去。后台的逻辑代码根本就不用分开,用命名空间分开即可,只要在UI上面做做到分开行了,当然有些要求比较高的,就是从UI到逻辑都是分开来写的,但是我这里觉得不用,读者可以根据自己的要求来做。

 

  直入主题,先说一下我写的例子的主体结构,直接把解决方案的截图拿上来,看看如何分层的。

 

                                 

  由于本人比较热衷于DDD的学习,所以就用DDD的思想实现了这个例子,对于DDD我就不去讲解了,可以翻看具体的文章。其中主要的是03Plugins这个里面放置的就是所有的插件的UI,逻辑代码我都是放到了05Applaction中去了。

  下面我来讲一下,如何使插件用到主项目中去,也就是所谓的“站点合并”。UI层我运用的是MVC,所以合并的关键就是路由的合并,插件的路由如何进入到主项目中去。

  在06Foundation中的Framework中,我实现了这样的方法。

                         

 

  下面以博客插件为例子讲解一下:

其中IPlugin.cs

// 作者:                    不要理我 CJ// 邮件:               869722304@qq.com(仅仅支持商业合作洽谈)// 创建时间:                2012-08-8// 最后修改时间:            2012-08-11// // 未经修改的文件版权属于原作者所有,但是你可以阅读,修改,调试。本项目不建议商用,不能确保稳定性。// 同时由于项目引起的一切问题,原作者概不负责。//// 本项目所引用的所有类库,仍然遵循其原本的协议,不得侵害其版权//// 您一旦下载就视为您已经阅读此声明。//// 您不可以移除项目中所有的声明。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web.Routing;namespace CJCMS.Framework.Plugin{    public interface IPlugin    {        ///         /// 插件名        ///         string PluginName { get; set; }                ///         /// 插件描述        ///         string Describtion { get; set; }                ///         /// 插件路由        ///         List
routes { get; set; } }}

插件管理类:

// 作者:                    不要理我 CJ// 邮件:               869722304@qq.com(仅仅支持商业合作洽谈)// 创建时间:                2012-08-8// 最后修改时间:            2012-08-11// // 未经修改的文件版权属于原作者所有,但是你可以阅读,修改,调试。本项目不建议在商用,不能确保稳定性。// 同时由于项目引起的一切问题,原作者概不负责。//// 本项目所引用的所有类库,仍然遵循其原本的协议,不得侵害其版权//// 您一旦下载就视为您已经阅读此声明。//// 您不可以移除项目中所有的声明。using System;using System.Collections.Generic;using System.Linq;using System.Text;using CJCMS.Framework.Routes;namespace CJCMS.Framework.Plugin{    public class PluginsManger:IPluginsManger    {        ///         /// 安装插件        ///         ///         /// 
public bool InstallPlugin(IPlugin plugin) { try { ///注册路由 RoutesRegister re = new RoutesRegister(); re.RegisterRoute(plugin.routes); ///记录插件表 /// return true; } catch { return false; } } /// /// 卸载插件 /// /// ///
public bool UnInstallPlugin(IPlugin plugin) { try { ///卸载路由 RoutesRegister re = new RoutesRegister(); re.DeleteRoute(plugin.routes); ///记录插件表 /// return true; } catch { return false; } } }}

 

BlogPlugin

// 作者:                    不要理我 CJ// 邮件:               869722304@qq.com(仅仅支持商业合作洽谈)// 创建时间:                2012-08-8// 最后修改时间:            2012-08-11// // 未经修改的文件版权属于原作者所有,但是你可以阅读,修改,调试。本项目不建议在商用,不能确保稳定性。// 同时由于项目引起的一切问题,原作者概不负责。//// 本项目所引用的所有类库,仍然遵循其原本的协议,不得侵害其版权//// 您一旦下载就视为您已经阅读此声明。//// 您不可以移除项目中所有的声明。using System;using System.Collections.Generic;using System.Linq;using System.Web;using CJCMS.Framework.Plugin;using System.Web.Routing;using System.Web.Mvc;namespace CJCMS.Plugin.Blog{    public class BlogPlugin :IPlugin    {        public List
routes { get; set; } ///
/// 插件名 /// public string PluginName { get; set; } ///
/// 插件描述 /// public string Describtion { get; set; } public BlogPlugin() { routes = new List
(); /* * 路由例子 routes.Add(new Route( "User/Login", new RouteValueDictionary(new { controller = "User", action = "Login" }), new System.Web.Mvc.MvcRouteHandler())); */ routes.Add(new Route( "{controller}/{action}/{id}/{k}", new System.Web.Mvc.MvcRouteHandler())); } }}

 

这样在主项目中加载插件的时候就可以调用了。

 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Routing;using CJCMS.Framework.Plugin;using CJCMS.Plugin.Blog;using CJCMS.Core;namespace CJCMS.Web{    // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,    // 请访问 http://go.microsoft.com/?LinkId=9394801    public class MvcApplication : System.Web.HttpApplication    {                public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                "Default", // 路由名称                "{controller}/{action}/{id}", // 带有参数的 URL                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值            );            /*             *              * 注册插件例子,这里应该注册安装时已经选中的插件,当然在项目已经运行的时候开启插件,也是这样子注册             *             IPluginsManger ipm = new PluginsManger();            IPlugin blogplugin = new BlogPlugin();            ipm.InstallPlugin(blogplugin);             */            IPluginsManger ipm = new PluginsManger();            IPlugin blogplugin = new BlogPlugin();            ipm.InstallPlugin(blogplugin);            //AutofacRepositity auto = new AutofacRepositity(builder);            //auto.RegisterRepositity();        }        protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            RegisterRoutes(RouteTable.Routes);        }    }}

 

 

最后要记得把插件UI复制到主项目中去,添加编译后指令

 

 

xcopy /s /y "$(ProjectDir)bin\*" "$(SolutionDir)CJCMS.Web\bin\"xcopy /s /y "$(ProjectDir)Content\*" "$(SolutionDir)CJCMS.Web\Content"xcopy /s /y "$(ProjectDir)Scripts\*" "$(SolutionDir)CJCMS.Web\Scripts"xcopy /s /y /i "$(ProjectDir)Views\*" "$(SolutionDir)CJCMS.Web\Views\Blog"

 

 

 也许这段代码

xcopy /s /y /i "$(ProjectDir)Views\*" "$(SolutionDir)CJCMS.Web\Views\Blog"

 你能看出些端倪,不错,下一讲就是主讲这句话,先卖个关子。

未完待续,希望大牛给予指导和好的建议。

 

Just waiting. Go on  coding.

 

 

$('#example').dataTable({"aoColumnDefs": [{

"aTargets": [3],
"fnCreatedCell": function(nTd, sData, oData, iRow, iCol) {
if (sData == "33") {
$(nTd).css("background-color", "blue")
}
}
}]});

转载于:https://www.cnblogs.com/ntcj/archive/2012/08/12/2634406.html

你可能感兴趣的文章
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
注解小结
查看>>
list control控件的一些操作
查看>>
一月流水账
查看>>
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>