OSGI(二)加载Bundle

           

   上篇博客,我们简单介绍了OSGI的理论,下面我们看看如何使用。

      第一个问题,我们为什么使用OSGIOSGI带来了什么?

     需求实现方面,OSGI为动态扩充、修改系统功能和改变系统行为提供了支撑,而在传统的开发方式下,要实现系统的动态扩充、修改以及改变是一件很麻烦的事。

      从技术角度方面,OSGI带来了规范化的模块组织以及统一的开发方式,这为传统的模块的组织、模块开发以及模块积累提供了一种全新的指导以及支撑,面向服务的组件模型设计思想、高效系统设计思想。

 

      第二个问题,如何使用?

       首先安装框架SDK,安装SDK后创建新项目时会出现iopenWork模板,创建iopenworks下的应用程序:

OSGI(二)加载Bundle

        Program类中,写开始代码,初始化窗体,程序由此开始;

 static void Main()
        {
           // UpdateCore();
            RunApplication();
        }
  
 private static void RunApplication()
        {
            
            //显示开放工厂为您提供。。。。。。
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            const string PAGE_NAME_LOGIN = "LoginPage";
            using (BundleRuntime bundleRuntime = new BundleRuntime())
            {
                //运行时启动
                bundleRuntime.Start();

                // 开启服务
                IPageFlowService pageFlowService = bundleRuntime.GetFirstOrDefaultService<IPageFlowService>();
                //判断服务是否启动
                if (pageFlowService == null)
                {
                    throw new Exception(Resources.IPageFlowServiceServiceNotFound);
                }

                // Assert the first page node.
                if (string.IsNullOrEmpty(pageFlowService.FirstPageNodeValue) ||
                    string.IsNullOrEmpty(pageFlowService.FirstPageNodeName) ||
                    pageFlowService.FirstPageNodeOwner == null)
                {
                    throw new Exception(Resources.CanNotFindAnAvailablePageNode);
                }

                // Load the form type of first page node.
                Type formType = pageFlowService.FirstPageNodeOwner.LoadClass(pageFlowService.FirstPageNodeValue);
                if (formType == null)
                {
                    throw new Exception(string.Format(Resources.CanNotLoadTypeFromBundle, pageFlowService.FirstPageNodeValue, pageFlowService.FirstPageNodeOwner.SymbolicName));
                }

                // Create the form instance of first page node and show it.
                Form formInstance = System.Activator.CreateInstance(formType) as Form;

                if (formInstance == null)
                {
                    throw new Exception(string.Format(Resources.TypeIsNotWindowsFormType, pageFlowService.FirstPageNodeValue, pageFlowService.FirstPageNodeOwner.SymbolicName));
                }

                // If first page node name is ‘Login‘ then, show the dialog and then run application.
                if (pageFlowService.FirstPageNodeName.Equals(PAGE_NAME_LOGIN))
                {
                    DialogResult result = formInstance.ShowDialog();
                    if (result == DialogResult.OK || result == DialogResult.Yes)
                    {
                        PageNode nextNode = pageFlowService.GetNextPageNode(pageFlowService.FirstPageNodeName);
                        if (nextNode != null)
                        {
                            Type mainPageFormType = nextNode.Bundle.LoadClass(nextNode.Value);
                            if (mainPageFormType == null)
                            {
                                throw new Exception(string.Format(Resources.CanNotLoadTypeFromBundle, nextNode.Value, nextNode.Bundle.SymbolicName));
                            }
                            Form mainPageForm = System.Activator.CreateInstance(mainPageFormType) as Form;
                            Application.Run(mainPageForm);
                        }
                    }
                }
                else // Run the application directly.
                {
                    //执行,显示界面
                    Application.Run(formInstance);
                }
            }
        }

          添加必要的引用和resource文件;程序即可运行,界面如下:

    OSGI(二)加载Bundle

    如果需要扩充功能,我们只需要将插件放在主程序的bin-plugins下,重新运行软件即可,如下:

    OSGI(二)加载Bundle

运行效果如下:

OSGI(二)加载Bundle

   

          我们添加的Plugin就进去了,是不是很灵活呢?如果我们又很多的plugins,我们可以像搭积木一样,将这些累加使用,效率是不是高了很多呢?

        那编辑插件难不难呢?如何编辑自己的插件呢?不用担心,iopenwork做的很好,自带了发布插件功能,我们只要将自己做好的插件发布即可。有了这样的功能给我们带来了很多的好处,比如:

       可插拔的系统, 基于OSGI的系统,可通过安装新的 Bundle 、更新或停止现有的Bundle 来实现系统功能的插拔。高效,可以将别人写好的插件拿过来直接用,省去了开发,节省了时间和成本,而且即插即用;如果有大量的插件的积累,那么会更高效;

       基于OSGI的系统采用的是微核机制,微核机制保证了系统的稳定性,微核机制的系统只要微核是稳定运行的,那么系统就不会崩溃,也就是说基于OSGI的系统不会受到运行在其中的Bundle 的影响,不会因为 Bundle 的崩溃而导致整个系统的崩溃。即使某一个插件崩溃了,不会影响整个系统的使用,系统其他部分仍然可以正常运行;

        

        下篇博客中,我们将介绍如何加载插件,加载需要注意的地方,不足之处敬请指正!

OSGI(二)加载Bundle

上一篇:Hibernate与JDBC、EJB、JDO的比较


下一篇:sqlbulkCopy