代码改变世界

最近架构随想

2014-07-28 08:19 by 圣殿骑士, 6108 阅读, 62 评论, 收藏, 编辑

今天新加坡放假,闲来无事就发一篇博客:一则总结归纳项目构架经验,审视并逐步提高自己;再者分享最近学习所得,希望各位能讨论并给些建议。六月三十日从原来公司离职,七月一日入职新公司,不知不觉已经快一个月了。最近忙于学习新的行业知识以及项目的重构设计,没有时间发博客,也没有时间回复邮件及博文评论,忘各位见谅!

今天发几张项目重构设计草图,如果大家对项目分层与文件夹结构比较感兴趣,可以参考几年前弦哥.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓),这次的架构方案基本是之前架构经验第一次在保险行业的使用,希望各位能积极探讨并给些意见!

整体方案:

根据个人经验,架构决定项目的成败以及高度,所以在编码之前一定要设计好项目的整体规划和架构。好的架构或者考虑比较全面到位的架构会极大的帮助团队,对项目起到灵魂的作用;糟糕的设计往往会把整个项目组带入泥潭或者恶性循环,对项目直接致命打击!

回归正题:

  • 整个架构分为Online(Web Application)和Offline(WPF Application)两部分。
  • Online(Web Application)需要支持不同的设备及浏览器,所以采用Bootstrap和ASP.NET MVC with Razor作为View,KnockoutJs作为MVVM框架。UI Designer设计好UI,然后由前端工程师绑定相应的UI Model到UI,后端工程师则负责相应的OOAD以及业务处理。
  • Offline(WPF  Application)需要在没有网络的情况下能正常工作,所以采用WPF  XALM作为View,MVVM Light作为MVVM框架。UI和后端的处理以及任务分配和Online(Web Application)基本一致。
  • Services :设置了Switch功能,可以配置是否使用WCF或者Web API或者直接调用Dll。
  • Domain Model:始终是应用程序的核心,必须投入大量精力,按照面向对象的分析和设计 (OOAD) 进行设计同时按照OOP进行开发。
  • Infrastructure:主要包括数据访问组件、通用权限框架、异常和日志处理组件、IOC/AOP功能、缓存机制,邮件,配置等基础或常用功能。
  • 行业知识:由于项目牵涉到具体的行业(保险业),所以在业务流程中创建了Insurance Engine,专门处理保险相关的基础功能。
  • 权限系统:由于整个项目比较庞大,再加上其他系统也需要用到同样的权限判断,所以创建了一个新的权限数据库,用来存储及处理权限相关的所有数据及规则,所有用户则来源于三个数据源(SQL Server, DB2和Active Directory)。
  • Unit Test:每一层都有单独的单元测试,方便项目功能自测,维护,重构,升级以及管理。28-7-2014 12-31-12 AM

组件之间的详细关系如下:

28-7-2014 12-27-11 AM

各层之间的执行顺序如下:

28-7-2014 12-34-29 AM

权限系统:

  • 用户来源于三个数据源(SQL Server, DB2和Active Directory)。
  • 现实世界和系统通过角色进行关联,现实世界的用户及组的变化尽量不要影响到系统。
  • 一个用户可以有多个角色,一个角色也分配给多个用户。
  • 权限分为功能权限和数据权限。
  • 权限系统要提供给几套系统使用,全部的接口通过Service的形式提供出来。

security

由于时间有限,设计可能存在诸多不足之处,如果大家有不同的意见或者建议,不妨在评论中指出,以便互相学习且共同提高!


作者:圣殿骑士
出处:http://www.cnblogs.com/KnightsWarrior/
关于作者:专注于微软平台项目架构、管理和企业解决方案。自认在面向对象及面向服务领域有一定的造诣,熟悉设计模式、TDD、极限编程、领域驱动、架构设计、敏捷开发和项目管理。现主要从事WinForm、ASP.NET、WPF、WCF、WF、Silverlight 、Biztalk、Windows Azure等云计算方面的项目开发、架构、管理和企业培训工作。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:KnightsWarrior(at)msn(dot)com  微博:圣殿骑士微博  联系我,非常感谢。

40
0
(请您对文章做出评价)
? 上一篇:关于新加坡IT薪酬
Add your comment

  1. #51楼[楼主] 圣殿骑士   2014-07-28 21:36
    @dotnet技术网
    引用我也有类似的想法,但真正开发起来,就非常麻烦,梦想很美好,现实很骨干。

    是的,很多时候实施起来比架构设计还难,不过类似项目经历多了就更容易一些了!
  2. #52楼[楼主] 圣殿骑士   2014-07-28 21:38
    @Da ge
    引用必须推荐,最好能有个demo让小伙伴们学习下

    DEMO还处在实施阶段!
  3. #53楼[楼主] 圣殿骑士   2014-07-28 21:40
    @春色园
    引用架构应该适应业务!!

    是的,这个架构就是适应业务和需求而画的,具体模块之间的划分还有几个图——用例图,类图,部署图等,由于与项目有关,没有公布出来。
  4. #54楼 jlzhou   2014-07-29 07:21
    期待代码示例 感谢
  5. #55楼 stoneniqiu   2014-07-29 08:14
    这样的项目 好想加入~~
  6. #56楼   2014-07-29 13:43
    请问一下你们单元测试用的什么框架
  7. #57楼 owlbcc   2014-07-29 14:32
    wpf的和mvc的两个viewmodel能不能合到一起?两个系统之间是不是差异还挺大的?
  8. #58楼 muki   2014-07-29 17:08
    架构太过于复杂了.
  9. #59楼 flyfish1986   2014-07-30 13:34
    来了!
  10. #60楼 HelloNet   2014-08-04 13:52
    看上去很牛逼的样子
  11. #61楼 Pansen   2014-08-05 08:58
    mark
  12. #62楼 高僧   2014-08-11 15:01
    楼主,上面这几图是用什么工具画的?

Phonegap Android篇

最近在使用phonegap 经过各方摸索和阅读各种资料碰到的问题都一一解决了,在这里写个总结方便大家和自己以后查阅,第13步以后可以不用理会前面就足以生成并发布APP了

升级项目cordova ,现在是3.5.0版本

D:\projectName>cordova platform update android

  1. Phonegap的安装,每一步都有相应的命令去检查到底有没有正确安装 ,如果没有后面编译的时候也有足够的提示信息提示哪里没有安装正确

环境 : WIN系统,JDK,Android,Eclipse,Ant,Git,PhoneGap3.x (Cordova)

1. 安装JRE,设置JAVA_HOME,比如JAVA_HOME=C:\program\Java\jre6\bin, 具体如何设置可以查看JDK的设置

检查:打java -version可查看java版本 如果确定装了JDK 但是打java出现找不到命令 那就是PATH没设置好了 在win7的环境变量里面设置 把JDK安装目录下的bin目录 复制进去

2. Cordova支持Android 2.2, 2.3, and 4.x.

下载安装SDK: http://developer.android.com/sdk/index.html

安装Android SDK,比如安装在c:\android-sdk\,需要把c:\android-sdk\tools和platform-tools添加到系统PATH环境变量中。

要不出后面第8步出错误:

[Error: The command `android` failed. Make sure you have the latest Android SDK installed, and the `android` command (inside the tools/ folder) added to your path. Output: ‘android’......   ]

3. 安装Eclipse,要能支持Android项目。http://www.eclipse.org/downloads/

4. 安装ant,并将ant.bat所在目录加到path环境变量,如c:\apache-ant\bin\,http://ant.apache.org  .

5. 安装Node.js,安装成功后,可在命令行输入命令:node 或 npm .   http://nodejs.org/  。

 (注:以下所有命令都在nodejs命令行窗口中输入的)

6. 安装PhoneGap工具集: 打开命令行,运行:npm install -g phonegap

7. 把盘符转到想要创建项目的目录,比如 c:\。

8.  创建App,运行:phonegap/cordova create hello com.vmeitime.hello HelloWorld

将在c:\hello下创建名为HelloWorld的项目,HTML5文件在C:\hello\www目录里。

第一个参数hello表示项目文件夹名,在此文件夹下会生成www子目录作为主页面存入目录,包括有css,js和img资源。 其中config.xml包括了重要的资源描述和项目配置信息.

第2个参数是可选的,com.vmeitime.hello表示项目包名; 第3个参数:HelloWord表示显示的文本;

也可用-i 和-n 命令选项: c:\> phonegap create hello -n HelloWorld -i com.vmeitime.hello

 c:\> phonegap create hello --name HelloWorld --id com.vmeitime.hello

当然,命令执行后,以上信息也可在后续开发中修改comfig.xml中的相应值。

 

9.  后续操作都要在创建的项目目录下进行:cd hello

10. 运行build命令,输入不同平台标识,生成不同平台下的相应文件。如下以android设备为例:

c:\hello> phonegap build android ,如果要build release 版本 :cordova build android –release(这里必须用cordova, 用phonegap无法生成release 版本)

 要查看详细(verbose)执行过程,可增加命令参数-V :

c:\hello> phonegap -V build android

之后可以看到C:\hello\platforms\android里出现Android项目。

11. 在模块器或移动设备上测试App: c:\hello>phonegap install android

 d:\projectName\platforms\android\ant-build>phonegap run android

也可用参数e专门指定运行在模块器上: c:\hello>phonegap -e install android

12. build和运行(相当于上面build和install两步骤操作):c:\hello>phonegap run android

也可用参数e专门指定运行在模块器上:c:\hello>phonegap -e run android

13 对release版本进行签名,首先你要先生成一个Keystore

这条命令是对release版本进行签名 这样才能发布到google play上去

d:\projectName \platforms\android\ant-build  >jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore xx.keystore  xx.apk  mykey -storepass xx

storepass 是你keystore的密码,mykey是你keystore的alias

可以用keytool -list -keystore myname.keystore 查看你keystore的具体信息

14签名完后 你要发布到google play去 会提示你没有进行zipalign

d:

cd D:\Enviroment\Android Software\SDK\sdk\tools

zipalign -f -v 4 "D:\ projectName\platforms\android\ant-build\project-release.apk" "D:\ projectName\platforms\android\ant-build\project.apk"

这样终于可以生成一个可以发布到google play 的apk了

15 调试有3种方法

  • 直接用命令phonegap run android
  • 用AVDmanger
  • 真机调试,可以把APK放到DROPBOX里然后直接安装就可以了

Icon 和splashscreen

 在3.5版本 config.xml要放在最上层的文件夹里 d:/project/config.xml

然后在config.xml加入这段

<platform name="android">

              <icon src="res/android/icon.png" density="ldpi" />

              <icon src="res/android/icon.png" density="mdpi" />

              <icon src="res/android/icon.png" density="hdpi" />

              <icon src="res/android/icon.png" density="xhdpi" />

     </platform>

Splahscreen 要直接 去d:\projectNam\platforms\android\res 里面设置

 

__________________________________________________________________________________________

16. 打开Eclispe,导入项目C:\hello\platforms\android,HelloWorld。

17. 可能项目有一些错误,把Android Project Build Target设置为最高等级的API Level一般就能解决。

18. 然后就可以用Eclipse启动项目了。

19. 可以用命令phonegap emulate android在模拟器里启动项目,不过感觉比Eclipse麻烦,总是启动一个新的模拟器。

用这个方法还要注意Android虚拟设备的版本,似乎至少是API Level 10,因为自动生成的AndroidManifest.xml里:

 

     <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17" />

 

20. 可以用命令phonegap run android在真实设备上运行App。

 

21. 添加插件(需要先安装git工具 https://help.github.com/articles/set-up-git):

 

   PhoneGap 3.0 最需要关注的是完全的插件体系结构,所有的功能特性包括摄像头等都是使用插件方式提供。也就是说新建项目后很多功能是无法使用的,你必须将其对应的插件添加到项目中。

例如在 cordova 中添加插件的方法是:

cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git

而通过 phonegap 命令行工具的方法是:

phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git

这意味着在开始 PhoneGap 项目时你要先考虑项目需要什么功能,然后通过命令行来添加这些功能。

1). 添加的插件都将放在C:\hello\plugins目录下.

 

2). 同时会在所有平台下的config.xml文件中增加feature插件配置,如:C:\hello\platforms\<平台>\res\xml\config.xml)

 

3). 增加相应的插件java文件:C:\hello\platforms\android\src

 

4). 增加相应的插件js文件:C:\hello\platforms\android\assets\www\plugins

 

下面是完整的插件列表,我直接拷贝过来,可能会有变化:

 

   Basic device information (Device API):

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git

 

   Network Connection and Battery Events:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-battery-status.git

 

   Accelerometer, Compass, and Geolocation:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device-orientation.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git

 

   Camera, Media playback and Capture:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media-capture.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media.git

 

   Access files on device or network (File API):

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer.git

 

   Notification via dialog box or vibration:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-dialogs.git

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-vibration.git

 

   Contacts:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-contacts.git

 

   Globalization:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization.git

 

   Splashscreen:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git

 

   Open new browser windows (InAppBrowser):

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

 

   Debug console:

 

       $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-console.git

 

 

 

   查看当前已安装的插件: $ phonegap local plugin list

 

   删除指定的插件: $ phonegap local plugin remove org.apache.cordova.core.console

 

 

 

22自定义各平台资源(merges):

 

   在www/merges/目录下创建各平台不同的资源文件,如css,js,图片等,引用相应的文件路径时,不需要写各平台路径。如:

 

   在www/index.html文件中添加自定义的css文件overrides.css如下:

 

       <link rel="stylesheet" type="text/css" href="css/overrides.css" />

 

   在www/merges/android/目录下创建针对于android平台的overrides.css,(如果是ios,由是www/merges/ios/overrides.css文件。)

 

   overrides.css文件中添加如下内容,覆盖www/css/index.css文件中默认的12px文字大小样式:

 

       body { font-size:14px; }

 

   这样,在android平台下,显示的文件是14px,其他平台下显示的文字是12px;

 

   也可添加各平台自定义的图片资源,如 merges/ios/img/back_button.png, 在www/index.html页面引用的写法是img/back_button.png.

 

 

 

23. 远程编译:

 

   默认情况下,是编译本地安装SDK环境的相应平台,生成目标在platforms。 但也可通过远程编译本地没有安装SDK(或已安装SDK)的相应平台。也可远程测试。

 

1). 首先,你要在PhoneGap Build网站(https://build.phonegap.com/) 上注册账号,并使用login命令登录操作。

 

   $ phonegap remote login -u iamreallyadog@gmail.com -p mYpASSw0RD

 

   $ phonegap remote login --username iamreallyadog@gmail.com --password mYpASSw0RD

 

    使用loginout命令退出登录phonegap build.

 

       $ phonegap remote logout

 

   2). 远程编译:$ phonegap remote build ios

 

   3). 要使用插件,你必须先添加插件到本地,然后再远程编译。如:

 

   $ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git

 

   $ phonegap remote build ios

 

4) $ phonegap remote install ios

 

   # ...or...

 

   $ phonegap remote run ios

 

5) 默认情况下是local本地编译,如下两命令是一样效果:

 

   $ phonegap local build ios

 

   $ phonegap build ios

 

 

 

24. 更新phonegap到最新版本命令:c:\> npm update -g phonegap

 

22. 查看phonegap版本命令:

 

   $ phonegap version

 

   $ phonegap -v

 

25. 查看phonegap详细信息命令:

 

   $ npm info phonegap

 

26。安装指定版本的phonegap命令:

 

   c:\> npm install -g phonegap@2.9.0-rc1-0.12.2

 

posted @ 2014-08-14 17:40  hudasm  阅读(1113)  评论(6编辑  收藏  举报