在2005年的时候,我曾经基于.NET 2003开发了一个小的组件,这个组件的目的是为了解决模块化开发和模块复用的问题。我将该组件命名为Common Form Framework,它的目的是允许每一个开发人员独立的开发自己的模块且可以直接专注于业务模块,然后通过配置可以快速将所有开发人员开发的业务逻辑窗体集成到这个组件中。

  该组件的思路如下图所示。该组件提供了一个如“2”标识的空的窗体,每一个开发人员通过编写一个如“1”的XML配置文件即可将一个模块的功能附加到空窗体,最终组合成一个如“3”所示的软件产品。

  这个组件成功的应用在一个由9个人合作开发,历时1年的应用系统开发中。它的想法和Microsoft Composite Application Block有一些类似,不过没有CAB那么强大了。

  在参考了CAB和经历更多应用系统之后,我发现该组件有不少缺点,比如:模块化定义不够标准、界面元素无法扩展、模块交互非常复杂、功能复用低、不能应用于Web或者其它应用环境等。为此,我参考了CAB和SCSF的一些功能,并在2007设计了一个Commom UI Platform规范,旨在设计一个更为强大简单的模块化快速开发平台。

  不过在2008年的时候,我有了更多的想法,提出了一个UIShell产品构思。UIShell是英文User Interface Shell的缩写,中文译为“用户界面外壳”。它是由一个软件模板框架。它由框架层、服务层、Shell层和系统模块层组成,提供了基于UIShell的软件设计和开发规范。 Shell中文译为“外壳”,它是应用系统的主界面,由可扩展的界面元素(如菜单、工具栏)和可替换的界面(如显示区)元素组成,如下图所示。

  这个产品面向的用户有2种:(1)开发人员——该产品能够为开发人员提供一个模块化设计规范、通用的界面框架和通用的服务,从而使得开发人员可以直接设计业务模块,不需要关心软件的界面、用户体验等;(2)最终用户——最终用户不需要去购买任何软件,可以通过基于该平台的软件超市中下载到所需的界面框架和应用模块,然后自己组装成最终的软件。

  在我现在看来,当时的想法确实有点疯狂,因为我想的太简单太远大了(不过,有时候还真需要疯狂才能干点什么,:)),不过我那会一点都没有意识到这点。我当时组了一个UIShellDev Team。我很骄傲的告诉团队,“一旦我们实现了UIShell,我们或许能够为软件行业开辟一个新的方向,为其贡献点什么”。

  于是我们便开始了UIShell产品之路,我们疯狂的学习了Enterprise Library、SCSF、SharpDevelop、Egeye Addin、MAF、MEF等,分析了SCSF的源代码、SD源代码,学习了Framework Design Guideline,关注每一个新出现的产品并分析竞争优势与劣势(如Google App Engine、Sina App Engine、MEF等,我们不能开发一个对开发人员来讲没有用且过时的产品,因此需要时刻保持警惕),制定了产品开发规范——“用户场景设计规范、需求规范、设计规范、质量保证体系等”…… 这个产品设计目标以“易用性”为首要目标,这意味着我们做任何功能都应该先想到用户,并模拟用户的行为习惯来不断的优化产品的设计。然而这条路并没有像我预想的那么容易,我原来以为这个产品早该在2009年底就发布了。设计的过程中,问题一个接一个,且由于我们团队是兼职的,进度比我预想的慢了许多。更为重要的是,当时想法是基于SCSF来做的,SCSF太过于复杂,并不能够满足我们的需求。在一个偶然的机会,我接触了OSGi规范,并利用业余时间将OSGi规范翻译了。看了OSGi后,我眼前一亮,我意识到了这就是我想要的。然而OSGi是基于Java的规范,由于.NET平台和Java平台的差异,我们需要设计一个符合.NET平台的规范。于是,我们便动手自己设计了OSGi.NET规范,在设计这个规范时,我们借用了OSGi规范但调整了它的目标,即OSGi.NET的定位是一个满足.NET不同应用环境的通用模块化运行时,它实现了OSGi的模块化与插件化、面向服务、模块扩展和安全性的功能。

  OSGi.NET规范及接口设计在2008年底设计完成,我记得当时完成设计的时候,我正在美国的Dublin,通过Email把设计的图纸和规范发送给UIShellDev Team。这是该规范的初稿。在接下来的日子里,我们不断的对设计进行重构,最终在2009年8月份实现了内核原型,在2009年10月份完成了OSGi.NET设计最终稿。当然,在重构的过程中,团队其他成员已经开始动手设计了。在这里我们设计了一个能够通用于各种.NET运行环境的模块化运行时,它实现了UIShell产品所有功能,并且易用性依然保持。我们自行设计了模块化规范、模块运行时类加载规范、SOA规范和扩展规范、开发与调试规范。不过,中间有一个决策比较困难,因为ASP.NET不同于WinForm、WPF和Console,它必须宿主在Web Server。那么,我们的争论就在于——是IIS宿主模块运行时还是模块运行时宿主IIS呢?如果模块运行时宿主IIS,那么它就有完全的控制权,不够运行于IIS的模块与模块运行时的其它模块间的通讯就麻烦了,因为这是跨进程通讯。如果IIS宿主模块运行时,那么模块运行时就比较被动了。最终讨论的结果是采用第二种方案,因为这种方案性能高、简单。在完成最终稿设计时,产品设计的所有问题便解决了。我们便投入所有的精力去实现。

  目前UIShell产品设计与实现已经进入尾声,这也意味着软件超市的基础平台已经基本构建完成。我们实现的OSGi.NET内核已经能够成功的宿主在.NET各种不同环境,并且各种环境的设计思路、开发思路完全一致。软件超市以后将会有不同环境的Shell模块、通用服务和应用模块,这样,用户和开发人员都可以去下载和组装软件,并且也可以去贡献自己开发的东西。

  还需要提到的是,UIShell产品在实现的过程中,关于质量保证体系的构建。事实上,产品设计的初始阶段,我是很希望所有的东西都能够非常的完善,包括质量保证体系,我当时是一个完美主义者。不过,我们并没有足够的资源来支撑“完美”。在这一过程中,我学会了妥协、学会了“软件中庸”,我们只能把有限的资源投入到最需要的地方,况且每一个阶段的目标还不同。当然了,我们现在已经构建了一个简单且有效的质量保证体系,它基于“Subversion/TotoiseSVN/AnkhSVN + CruiseControl.NET/NAnt + BugTracker.NET”实现。Subversion提供了类似ClearCase的配置管理功能,是一个开源免费的产品,它提供了强大的Branch/Tag管理,Branch/Tag是我当时选择配置管理工具的首要要求,这是产品线管理的必备功能。CruiseControl.NET/Nant用于持续集成,在每一个代码更新时,它都会自动Build,我们可以看到产品线是否健康,此外,还有一个很重要功能,我们可以随时构建一个新的用于测试的安装包。BugTracker.NET也是一个开源的缺陷管理工具,我们可以随时创建Bug。它在每次Bug更新时,都会向团队发送邮件。它提供了强大的缺陷统计管理,在Bug Fixing阶段,我们可以方便的安排产品不同阶段需要Fix的所有Bug,也可以用于统计每一个人的工作量。当然了,我们还根据需要对BugTracker.NET进行了改进,主要有2个:(1)当代码提交时,Bug状态自动变为Check in并发送邮件;(2)加入代码审计功能,可以方便的为每一个Bug生成代码审计包,从而使得我们可以方便查看每一个Bug所做的更改。以下是一个BugTracker.NET Email通知示例。

  目前UIShell内核产品由安装包工程、VS插件工程、Remote Console工程、OSGi.NET工程、SaaS工程、Web Extension工程、Shell工程、测试工程和Help工程构成。只要在不同环境中采用如下方式宿主模块运行时,这个环境便具有了OSGi.NET的所有特性。现在经过测试的环境有控制台、WinForm和ASP.NET,接下来我们在完善了文档、Sample之后将发布第一个版本,并在下个版本中实现对更多环境的集成测试,完善产品,并构建软件超市网站。

  此外,我们还将构建一个SaaS商店,不过这是另一个产品了,我将会在以后介绍我们SaaS商店产品了。最后我要感谢UIShellDev Team的所有成员,他们为产品的构建付出了很大的努力,提出了很多有建设意义的想法,这个产品是一个团队的结晶。在产品研发过程中,我们体验了团队1+1>2的力量。没有他们的付出,UIShell产品是不可能实现的,更别提其它宏伟的想法了。每次想起与团队开发过程中的细节,我都非常的骄傲和感动,这些人真nice!

namespace SimpleBundleShell
{
class Program
{
static void Main(string[] args)
{
// 启动模块化运行时,这样,它就会自动的从plugins加载所有模块
// 并启动它们。在这里,一个模块=普通.NET项目 + Manifest.xml。
// 因此,模块的开发和我们原来开发一个.NET项目的方式是完全一样
// 的,我们不需要学习新的知识。
using (BundleRuntime bundleRuntime = new BundleRuntime())
{
bundleRuntime.Start();
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
}
}
}

一起谈.NET技术,疯狂的想法——基于.NET的软件超市平台构想与5年实现之路相关推荐

  1. 前段react技术架构图_基于 React 的可视化编辑平台实践

    前言 前段时间发在朋友圈的一句话:各种自主搭建的平台,想起好多年各种DIY博客,行业门户网站,本质不变,变的是实现的手段了. 正文从这开始-- 本文主要介绍了基于 React 构建可视化编辑平台的实践 ...

  2. 毕业设计-基于机器学习的软件漏洞挖掘方法

    目录 前言 课题背景和意义 实现技术思路 一.基于机器学习的软件漏洞挖掘流程 二.代码的表征形式 实现效果图样例 最后 前言

  3. 【软考 系统架构设计师】原创必过论文④ 论基于构件的软件开发

    >>回到总目录<< 文章目录 论基于构件的软件开发 范文 摘要 正文 论基于构件的软件开发 软件系统的复杂性不断增长.软件人员的频繁流动和软件行业的激烈竞争迫使软件企业提高软件 ...

  4. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  5. 一起谈.NET技术,梦想创造可能——盘点微软 .NET 技术八年发展历程

    文 / 刘如鸿 2000年对于微软是颇有意思的一年,一方面终于迈入了21世纪,担心许久的千年虫问题也没有预想中的那样大面积爆发,通过Windows 95和Windows 98的成功,微软在桌面电脑市场 ...

  6. 浅谈虚拟化技术下的云安全如何处置

    浅谈虚拟化技术下的云安全如何处置 近年来,云计算是目前非常热门的一个研究领域,其实它并不是一种全新的技术,而是许多技术的融合体,包括分布式计算.动态和拓展等各种各样的技术算法,而虚拟化技术是云计算里最 ...

  7. 从研发角度谈存储技术的学习

    从研发角度谈存储技术的学习 收藏 对于研发人员,存储技术的学习内容非常之多.我根据自己的理解,把它们大致分为以下8项内容: http://blog.csdn.net/liuben/archive/20 ...

  8. 智能车浅谈——抗干扰技术软件篇

    文章目录 软件抗干扰技术 数字信号的抗干扰措施 数字输入信号软件抗干扰措施 数字输出信号软件抗干扰措施 数字滤波 算术平均值滤波 中值滤波 滑动平均滤波 归一化 差比和 CPU及程序的抗干扰措施 复位 ...

  9. 计算机辅助设计对提升产品质量,浅谈CAD技术与计算机辅助设计的应用

    浅谈CAD技术与计算机辅助设计的应用 来源:用户上传 作者: 杨思宇 [摘 要]随着社会经济的不断发展与进步,各领域的技术也不断的进行着革新.本文以计算机辅助设计当中的开发出的成组技术为主,对成组技术 ...

  10. 再谈P2P技术:网络拓扑结构、核心技术分析

    随着P2P应用的蓬勃发展,作为P2P应用中核心问题的发现技术除了遵循技术本身的逻辑以外,也受到某些技术的发展趋势.需求趋势的深刻影响. P2P协议概述 P2P打破了传统的Client/Server ( ...

最新文章

  1. 编写一个最简单的.php,学习猿地- 说明 如果我们要编写一个简单的PHP脚本,需要学习哪些...
  2. matlab画平行坐标轴的直线
  3. uniapp 生成Android证书及.keystore转.jks、.pem
  4. 前端学习(1265):接口调用axios
  5. php发卡8.0源码_素材资源解析平台PHP源码 V8.0运营版+会员功能+代理功能+卡密充值...
  6. 面试官系统精讲Java源码及大厂真题 - 41 突破难点:如何看 Lambda 源码
  7. 性能测试之:loadrunner 报lr_load_dll 失败 CCI trace: vuser_init.c(6): ci_load_dll查证及解决过程...
  8. Chrome浏览器的版本查看 以及V8 javascript 引擎版本查看
  9. 15款非常有用的前端开发CSS网格(grid system)生成器
  10. 3.33 利用快速蒙版制作选区 [原创Ps教程]
  11. SAP GUI登陆系统报Validity of certificate from list with PSE type >SSL错误弹窗
  12. pycharm更改运行环境
  13. 认识 BASH Shell
  14. jQuery思维导图
  15. Python全局变量的隐藏“窍门”
  16. mysql创建应用账号
  17. 玻色量子CEO文凯博士出席GTIC 2022全球AI芯片峰会,解读光量子计算新进展
  18. 顺为、小米联合领投支出宝,官网启用三拼域名!
  19. python学的好,牢饭吃的早欸嘿
  20. 全面战争模拟器 for Mac(模拟战争游戏)

热门文章

  1. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象之final、abstract抽象、和变量生命周期...
  2. 初探Windows用户态调试机制
  3. Springmvc返回中文字符乱码问题
  4. error while loading shared libraries: libtinfo.so.5
  5. 埃森哲发布 2015 年五大 IT 趋势预测
  6. MySQL 数据库重装失败最后一步无法启动server的解决办法
  7. 适合iOS的15大网站推荐
  8. Android引领移动互联网革命的七大理由
  9. 加载项目失败的解决办法
  10. 31、栈的压入、弹出序列(Python)