从阿里软件平台到TOP,一个好的应用和失败的运营-技术篇
2009-12-23 14:02
288 查看
上一篇中讲到了 快递吧 系统的开发历程,这里简单讲讲系统中涉及到的稍微有点价值的技术细节。
系统由服务器和客户端组成,服务器端是.net3.5开发的B/S程序,客户端最开始用的WPF,现在改为.net2.0的普通应用程序。
服务器端:
使用 ADO.NET Entity Framework 来做数据访问层
优点:这个十分的方便,节约了很多的时间,数据结构有变化,也能很快修改,至于性能,因为数据量不大,所以还不好说,几十万条数据中读取20条并显示到页面,一般不到1秒。
缺点:在设计器中删除一个表,XML中并不能完全删除,导致无法再把这个表添加进来,只能用XML编辑器打开edmx文件,删除多余的部分,才能重新添加;
存储过程需要返回一个实体才能在以面向对象的方式访问(在DatabaseEntities的实例化对象中才会有这个方法),否则只能用EntityCommand去执行。
注意:有了LINQ,可以很方便的联合查询一些数据,甚至可以将内存里构建的LIST和数据库里面的表一起做联合查询,如:
代码
public static class ExpressDealFactory
{
private static AppDomain _ExpressDealDomain = null;
private static RemoteLoaderFactory _ExpressDealAssembly = null;
private static IRemoteInterface _Instence = null;
private static object obj = new object();
private static readonly string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dll/StreamSea.Express.Deal.dll");
public static ReturnValue GetExpressList(string param)
{
ReturnValue r= Instence.Invoke(param);
return r;
}
public static AppDomain ExpressDealDomain
{
get
{
if (_ExpressDealDomain == null)
{
lock (obj)
{
if (_ExpressDealDomain == null)
{
AppDomainSetup objSetup = new AppDomainSetup();
objSetup.ApplicationName = "ExpressDeal";
objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
objSetup.PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
objSetup.CachePath = AppDomain.CurrentDomain.BaseDirectory;
objSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
objSetup.ShadowCopyFiles = "true";
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
Evidence evidence = new Evidence(baseEvidence);
evidence.AddHost(new System.Security.Policy.Zone(System.Security.SecurityZone.MyComputer));
_ExpressDealDomain = AppDomain.CreateDomain("ExpressDealDomain", evidence, objSetup);
}
}
}
return _ExpressDealDomain;
}
}
public static RemoteLoaderFactory ExpressDealAssembly
{
get
{
_ExpressDealAssembly = ExpressDealDomain.CreateInstance("StreamSea.Common", "StreamSea.Common.RemoteLoaderFactory").Unwrap() as RemoteLoaderFactory;
return _ExpressDealAssembly;
}
}
public static IRemoteInterface Instence
{
get
{
_Instence = ExpressDealAssembly.Create(filePath, "StreamSea.Express.Deal.ExpressDeal", null);
return _Instence;
}
}
这样,我们就可以动态的加载一个应用程序域,然后执行里面的方法,需要更新的时候,先卸载掉这个域:
if (_ExpressDealDomain != null)
{
AppDomain.Unload(_ExpressDealDomain);
}
替换dll/StreamSea.Express.Deal.dll这个文件,再加载执行,程序就更新完成了。
客户端程序:
客户端最开始使用的WPF做的,界面很漂亮,我没有仔细学习过这个,找了个示例自己修改了几下,先看看效果:
做的是一个托盘程序,自己做的菜单按钮:
鼠标移动时按钮是有效果的:
查询淘宝发出快递的界面:
查询其他的快递
大家可能没看出来,我的操作系统是最丑的Windows 2003,所以能有这样的效果已经很不错了。
后台的C#代码和普通的程序没有什么区别,主要是界面的设计上有了很大的变化,由于学艺不精,就不乱讲了,说一说体会。
界面很炫,很酷,很拉风。
要安装.net3.5,近300M的东西,一般用户太难接受。
内存占用太多,一启动就好几十M,开几个窗口就上百。
内存不释放,窗体我都只能做成静态的,关闭就是隐藏掉,打开就是显示,而不能new一个,否则,内存只增不减。
做成静态的之后,会无规律的出现一个问题,程序的功能没有任何问题,但是界面没有任何反应,不是无响应那种,而是鼠标上去没有动画,界面上的所有控件不会被重绘,点击按钮,代码可以正常执行,但是就是不会有动画,文本框中输入文字,文字能够输入(用WPF性能分析工具能够看到),但是界面上不会变;最小化一下窗体,就会正常了。搞了很久,不知道什么原因,估计与内存回收有关。
客户端的部署是用ClickOnce做的,也挺有意思的,后面有空再写吧。写得不好,请多海涵。
系统由服务器和客户端组成,服务器端是.net3.5开发的B/S程序,客户端最开始用的WPF,现在改为.net2.0的普通应用程序。
服务器端:
使用 ADO.NET Entity Framework 来做数据访问层
优点:这个十分的方便,节约了很多的时间,数据结构有变化,也能很快修改,至于性能,因为数据量不大,所以还不好说,几十万条数据中读取20条并显示到页面,一般不到1秒。
缺点:在设计器中删除一个表,XML中并不能完全删除,导致无法再把这个表添加进来,只能用XML编辑器打开edmx文件,删除多余的部分,才能重新添加;
存储过程需要返回一个实体才能在以面向对象的方式访问(在DatabaseEntities的实例化对象中才会有这个方法),否则只能用EntityCommand去执行。
注意:有了LINQ,可以很方便的联合查询一些数据,甚至可以将内存里构建的LIST和数据库里面的表一起做联合查询,如:
代码
public static class ExpressDealFactory
{
private static AppDomain _ExpressDealDomain = null;
private static RemoteLoaderFactory _ExpressDealAssembly = null;
private static IRemoteInterface _Instence = null;
private static object obj = new object();
private static readonly string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dll/StreamSea.Express.Deal.dll");
public static ReturnValue GetExpressList(string param)
{
ReturnValue r= Instence.Invoke(param);
return r;
}
public static AppDomain ExpressDealDomain
{
get
{
if (_ExpressDealDomain == null)
{
lock (obj)
{
if (_ExpressDealDomain == null)
{
AppDomainSetup objSetup = new AppDomainSetup();
objSetup.ApplicationName = "ExpressDeal";
objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
objSetup.PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
objSetup.CachePath = AppDomain.CurrentDomain.BaseDirectory;
objSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
objSetup.ShadowCopyFiles = "true";
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
Evidence evidence = new Evidence(baseEvidence);
evidence.AddHost(new System.Security.Policy.Zone(System.Security.SecurityZone.MyComputer));
_ExpressDealDomain = AppDomain.CreateDomain("ExpressDealDomain", evidence, objSetup);
}
}
}
return _ExpressDealDomain;
}
}
public static RemoteLoaderFactory ExpressDealAssembly
{
get
{
_ExpressDealAssembly = ExpressDealDomain.CreateInstance("StreamSea.Common", "StreamSea.Common.RemoteLoaderFactory").Unwrap() as RemoteLoaderFactory;
return _ExpressDealAssembly;
}
}
public static IRemoteInterface Instence
{
get
{
_Instence = ExpressDealAssembly.Create(filePath, "StreamSea.Express.Deal.ExpressDeal", null);
return _Instence;
}
}
这样,我们就可以动态的加载一个应用程序域,然后执行里面的方法,需要更新的时候,先卸载掉这个域:
if (_ExpressDealDomain != null)
{
AppDomain.Unload(_ExpressDealDomain);
}
替换dll/StreamSea.Express.Deal.dll这个文件,再加载执行,程序就更新完成了。
客户端程序:
客户端最开始使用的WPF做的,界面很漂亮,我没有仔细学习过这个,找了个示例自己修改了几下,先看看效果:
做的是一个托盘程序,自己做的菜单按钮:
鼠标移动时按钮是有效果的:
查询淘宝发出快递的界面:
查询其他的快递
大家可能没看出来,我的操作系统是最丑的Windows 2003,所以能有这样的效果已经很不错了。
后台的C#代码和普通的程序没有什么区别,主要是界面的设计上有了很大的变化,由于学艺不精,就不乱讲了,说一说体会。
界面很炫,很酷,很拉风。
要安装.net3.5,近300M的东西,一般用户太难接受。
内存占用太多,一启动就好几十M,开几个窗口就上百。
内存不释放,窗体我都只能做成静态的,关闭就是隐藏掉,打开就是显示,而不能new一个,否则,内存只增不减。
做成静态的之后,会无规律的出现一个问题,程序的功能没有任何问题,但是界面没有任何反应,不是无响应那种,而是鼠标上去没有动画,界面上的所有控件不会被重绘,点击按钮,代码可以正常执行,但是就是不会有动画,文本框中输入文字,文字能够输入(用WPF性能分析工具能够看到),但是界面上不会变;最小化一下窗体,就会正常了。搞了很久,不知道什么原因,估计与内存回收有关。
客户端的部署是用ClickOnce做的,也挺有意思的,后面有空再写吧。写得不好,请多海涵。
相关文章推荐
- 从阿里软件平台到TOP,一个好的应用和失败的运营
- Java EE是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用.随着WEB和EJB容器概念诞生,使得软件应用业开始担心SUN的伙伴们是否还在Java平台上不断推出
- 【瑞星博客大赛】从我做的软件谈云安全的应用开放平台部署(技术篇、规划篇)
- 推荐一个专业的Android应用移动平台分析工具
- Inbox:发布一个开源的电子邮件应用平台
- 最近工作做一个医疗影像设备软件平台!
- SNS社区软件。借助预置的微博、群组、日志、相册、贴吧、问答等应用模块,近乎可以帮助客户快速搭建以用户为中心、用户乐于贡献内容、互动无处不在、易于运营的社区网站,并且能够满足快速成长的在线社区对软件系统的要求。
- WebCalendar是一个基于Web的日历应用软件
- ETL应用:一种一次获取一个平台接口文件的方法
- “软件应用与平台框架设计、开发与应用”12月培训圆满结束
- 软件安装失败的一个问题
- Android在一个应用中启动另一个应用的Activity时失败的解决办法
- myApps软件开发平台是一个工具 更是一种管理思想
- 搭建一个开发Predix软件的Ubuntu 系统(2)配置使用Predix工业云平台的基础环境
- 下载了一个用IBM Rational软件开发平台进行SOA开发的实践指南
- OAuth2.0学习(1-2)OAuth2.0的一个企业级应用场景 - 新浪开放平台微博OAuth2.0认证
- 互联网运营真的缺少一个好平台?
- 移动应用开发平台Top 10
- (上篇二)一个从来被人忽视的软件容易失败及发展缓慢的原因
- 推荐一个比较不错简单的php运行平台软件PHPnow 搭建 PHP 环境[安装图文教程]