摘要: InChatter现在支持本地化了,其实这个只是很细节的东西,但是咱也是可以走走国际范。哈哈其实最重要的原因只是想进行一次本地化的开发。这个概念相信大部分人都有,但是在实际项目中真的很少会涉及到,我也就InChatter这个项目来实践下本地化开发。一、InChatter的本地化实施1.新建一个新的类库,命名为:InChatter.Localization2.在项目右键->属性,打开项目工程的属性窗口3.选择资源页签,修改资源的访问修饰符为Public(这样我们才可以访问资源)4.按图中的方式添加你定义你的系统资源。保存以后,可以在Properties文件夹中看到我们的资源文件Resour 阅读全文
posted @ 2014-01-15 23:29 Skysper 阅读(858) 评论(0) 推荐(0) 编辑
摘要: InChatter客户端的开发可以说是目前系统的阶段性结尾了。很抱歉的是,这篇文章来的这么晚,迟到了这么久。在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理一、消息的传输与处理消息的传输示意图如下:所有的消息的接受将首先通过事件发送到消息池,消息池接受消息做进一步处理。如果消息是发送给当前交互对象(系统消息或正在聊天的目标),消息将直接转发给交互窗体进行显示;否则,将弹出消息提示窗体,告知用户消息的到达。在此基础上,对于未读消息和离线消息也进行了对应的处理,这也是在上一节之后,系统的诸多变更之初,具体可参见源码部分。理解了消息交互的整个流程,我们便可以更好的把握客户端部分 阅读全文
posted @ 2013-12-24 23:01 Skysper 阅读(1124) 评论(4) 推荐(2) 编辑
摘要: 一、常量常量是其值在使用过程中不会发生变化的变量。在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量:constinta=100;//a的值将不可以改变常量的特征:常量必须在声明时初始化。指定了其值以后,就不能再修改了。常量的值必须能在编译时用于计算。因此不能从一个变量中提取的值来初始化常量。如果需要这么做,应该使用只读字段。常量总是静态的,但注意,不必在常量的声明中包含修饰符static。(实际上,不允许)在程序中使用常量至少有3个好处:常量用易于理解的清楚的名称替代了含义不明确的数字或者字符串,使得程序更加易于阅读。常量使程序更容易修改。例如在C#程序中有一个 阅读全文
posted @ 2013-12-18 23:52 Skysper 阅读(888) 评论(0) 推荐(0) 编辑
摘要: 一、params关键字prams告诉函数的调用者,该函数的参数数量是可变,如果调用函数的参数标识了params关键字,那么我们可以使用逗号分割的参数或者一个数组来作为参数:1.这里只能是数组,List等集合是不可以的2.带params标识的参数必须是函数的最后一个参数,因此能一个函数也只能有一个带params标识的参数。来自MSDN代码示例:public class MyClass{ public static void UseParams(params int[] list) { for (int i = 0; i < list.Length; i++) ... 阅读全文
posted @ 2013-12-12 21:33 Skysper 阅读(1442) 评论(0) 推荐(0) 编辑
摘要: 在项目中使用Command绑定能够使我们的代码更加的符合MVVM模式。不了解的同学可能不清楚,只有继承自ButtonBase类的元素才可以直接绑定Command(Button、CheckBox、RadioButton等)如果我们要处理Label或者其他的一些控件,那么只能在走事件:这样的话,我们不得不在窗体类中处理事件代码和部分逻辑,这样就无法得到干净的MVVM模式了,那么我们应该怎么做呢?Blend为我们提供了解决方案,我们安装Blend以后,便可以获取到System.Windows.Interactivity.dll,添加该dll到项目引用 ... 阅读全文
posted @ 2013-11-19 21:05 Skysper 阅读(25431) 评论(2) 推荐(10) 编辑
摘要: 字符转义字符备注& (ampersand)&amp;这个没什么特别的,几乎所有的地方都需要使用转义字符> (greater-than character)&gt;在属性(Attribute values)中必须进行转义,在内容(Content)中如果没有符号的前面,可以不进行转义,直接使用>在 阅读全文
posted @ 2013-11-18 23:37 Skysper 阅读(8528) 评论(7) 推荐(4) 编辑
摘要: 一、模块结构首先来看下客户端消息处理中心模块的简单结构:ChatCallback:服务器端我们定义的回调接口IChatCallback的客户端实现ChatMsgCenter:服务端的消息处理中心,所有的消息都将在这里进行分发处理,可以比作人的大脑中枢ClientContext:登录信息描述,也可以理解为客户端唯一标识DataHelper:数据库操作类,这里我们使用NDatabase的开源对象数据库,使用方法参考关法文档Messager:消息类封装,在消息的基础上,添加了ID属性和IsRead属性二、技术实现1.ChatCallbck的实现原理using System;using System. 阅读全文
posted @ 2013-11-11 22:51 Skysper 阅读(1115) 评论(4) 推荐(2) 编辑
摘要: 今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流。开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按照自己的思路,完成后面的部分。下面我们开始客户端的开发,我们新建一个类库项目,作为与服务器端交互的中枢,同时也是为了分离服务和界面逻辑。目前我们将首先我们WPF客户端开发,在稍后的时间,我们再进行Winform的开发。1.新建类库项目,作为客户端与服务器端的交互中枢2.在新项目上添加服务引用3.在弹出的窗体中输入我们的服务地址(服务地址可以从服务器端获取到):net.tcp://localhost 阅读全文
posted @ 2013-11-09 22:48 Skysper 阅读(1505) 评论(2) 推荐(1) 编辑
摘要: 为了部署的方便,我们开发Windows服务的服务寄宿程序,这样我们的服务便可以作为系统服务,随着系统的启动和关闭而启动和关闭,而避免了其他的设置,同时在服务的终止时(如系统关闭等)能及时处理服务的关闭事件。一、Windows服务开发在解决方案中,新建一个Windows服务,如下图所示:打开Service服务的设计界面,右键"添加安装程序"右键选择"属性",打开属性侧边栏,可以修改服务的属性信息(如名称)修改ServiceProcessInstaller和ServiceInstaller的属性信息 下面我们针对Service的OnStart和OnStop进 阅读全文
posted @ 2013-11-06 21:55 Skysper 阅读(703) 评论(1) 推荐(1) 编辑
摘要: 现在我们继续进行InChatter系统的服务器端的开发,今天我们将实现服务契约同时完成宿主程序的开发,今天结束之后服务器端将可以正常运行起来。系统的开发是随着博客一起的,颇有点现场直播的感觉,所有在写博的过程中,可能会回头重新讲解和修复以前的设计不合理的地方,同时也可能会融合新的想法以及功能模块,提前跟各位看客交代下,请大家见谅。不过我想这个过程对大家也是有利的,在这个过程中,一是带大家重新回顾一下以前的设计想法并与现在进行比较,二是可以增长大家的项目设计的感觉,增长经验,这也是项目开发中不可避免的。所以,这也是我坚持直播的原因,如果文章中有什么不对的地方或者修改意见,欢迎大家指正,好的修改建 阅读全文
posted @ 2013-11-05 22:07 Skysper 阅读(893) 评论(0) 推荐(0) 编辑
摘要: 服务器端是整个消息系统的中枢,类似与人类的大脑。没有他,根本无法实现客户端之间的交流,为什么呢?这也涉及到我们的系统涉及,在服务器端,每个客户端的标识数据都会在服务器端进行保存,在这种情况下,当某一个客户端请求与另外一个客户端进行交流时,我们便可以在服务器端保存的客户端列表中,找到目标客户端,并发送消息。下面我们就一步步来实现我们新建一个InChatter的解决方案,默认的项目可以稍后再做处理,也可是删除,我们在项目中新建一个WCF服务库(英文版本的朋友们自行参考)在上图中,我们看到有WCF服务库、WCF服务应用程序、WCF工作流服务应用程序,我简单介绍下:WCF服务库需要我们自己开发服务寄宿 阅读全文
posted @ 2013-11-04 22:12 Skysper 阅读(1032) 评论(0) 推荐(0) 编辑
摘要: 最近在研究WCF,又因为工作中的项目需要,要为现有的系统增加一个聊天模块以及系统消息提醒等,因此就使用WCF做服务器端开发了一个简单的系统。开发最初学习了东邪孤独大哥的《传说的WCF系列》,文章写的很好,有兴趣的朋友也可以参考写,文章深入浅出,非常不错,坚持看完,相信在WCF方面可以入个门了,而且听说孤独大哥也来到的博客园呢~上面绝非广告,完全是真心的感谢,没有孤独大哥的文章,开发之初可能真的不会像现在这么顺利,现在软件的聊天模块已经可以正常运行和交流了。所以呢,我也想趁着这次机会:把自己学习到的知识,总结一下拿出来跟大家分享下就一步完善自己的聊天模块,希望能够做成一个开源的通用模块一直都想把 阅读全文
posted @ 2013-11-03 22:16 Skysper 阅读(1345) 评论(0) 推荐(1) 编辑
摘要: 在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操作、文件IO操作直接上代码,方便我们理解怎么通过Lazy类实现对象的延迟加载。 class Program { static void Main(string[] args) { foreach (var item in Product.GetProductListLazy()) { //下面的操作会执行Product类的构造... 阅读全文
posted @ 2013-07-09 22:23 Skysper 阅读(4692) 评论(3) 推荐(2) 编辑
摘要: 09年接触Asp.Net编程,在10年开始接触三层,当时不懂架构更不了解三层的内在,只是知道通过三层产生的BLL、DAL、Model能够实现程序的方便管理,同时也因为代码生成器的帮忙,大大加快了开发的效率,我们可以用很短的时间来生成一个三层架构。现在一直从事C/S客户端开发(WPF),却发现现有的系统架构仍然可以使用层级思想来架构。1.公共类库层公共类库包括一些通过类库和一些跟现有系统相关的引入组件(不依赖于当前系统)把公共类库作为最底层,是为了实现其他高级层对其引用,由于公共类库层不依赖与现有系统,故而可以被所有模块引用2.数据层数据层处理是系统的数据处理中枢,数据层可以细分为两个小层:基础 阅读全文
posted @ 2013-07-03 23:14 Skysper 阅读(2934) 评论(4) 推荐(2) 编辑
摘要: 读语句: String str = ConfigurationManager.AppSettings["DemoKey"];写语句: Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); cfa.AppSettings.Settings["DemoKey"].Value = "DemoValue"; cfa.Save();配置文件内容格式:(app.config) System.Configuration. 阅读全文
posted @ 2013-06-03 14:43 Skysper 阅读(1212) 评论(0) 推荐(0) 编辑
摘要: 'hqx'=>'application/mac-binhex40','cpt'=>'application/mac-compactpro','doc'=>'application/msword','bin'=>'application/octet-stream','dms'=>'application/octet-stream','lha'=>'application/octe 阅读全文
posted @ 2013-05-28 17:31 Skysper 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。 本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQL代码,我们需要掌握一些基本代码优化的技巧,所以,我们将从一些基本优化技巧进行介绍。 本文目录代码中的问题数据库性能开销使用存储过程使用数据库事务使用SqlBulkCopy使用表参数 1.1.2 正文 假设,我们要设计一个博客系统,其中包含一个用户表(User),它用来存储用户的账户名、密码、显示名称和注册日期等信息。 由于时间的关系,我... 阅读全文
posted @ 2013-05-11 09:51 Skysper 阅读(412) 评论(0) 推荐(1) 编辑
摘要: 一直以来收到最多的问题,莫过于产品经理如何入门之类的问题。今天将我平时回答的整理一下,以后有补充,就更新这篇博文。写给想要做产品经理的同学对产品经理职位的正确认识1、做产品的,不带经理。千万别太在意经理二字。2、做产品的,别太把自己当回事。别参与公司政治斗争,安静做事。3、产品同学,为需求而生。发现需求,定义产品,带领团队实现需求做出产品。4、请严格区分产品助理、产品设计师、产品经理、产品运营,不能统称为产品经理。5、假如产品经理是CEO的学前班,请学会做产品,同时要学会运营产品。产品同学如何入门书籍产品相关书籍0-1岁 《人人都是产品经理》苏杰 著介绍产品思维和操作流程1-3岁 《用户体验的 阅读全文
posted @ 2013-04-25 10:08 Skysper 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 很多C#的教材都会强调对象相等的概念。我们都知道,在C#的世界里存在两种等同性。一种是逻辑等同性:如果两个对象在逻辑上代表同样的值,则称他们具有逻辑等同性。另一种是引用等同性:如果两个引用指向同一个对象实例,则称他们具有引用等同性。 众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等。Object的Equals的默认实现比较的是两个对象的引用等同性。而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不... 阅读全文
posted @ 2013-04-22 14:43 Skysper 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 由于Windows phone 8的开发需要Windows 8的环境,所以想要在现有的Windows 7系统上安装双系统来满足开发的需要(在VMWare中安装了Windows 8以及Windows Phone 8 SDK等Develper Tools,不知是否是因为VMVare本身的虚拟技术和Windows Phone模拟器相冲突,从而使得在Visual Sutodio Express For Windows Phone 中的调试时,连接模拟器出错,不知是否有大神成功了,求指教)。在网上查找到有关资料后,便开始着手准备了。我想我的胆子还是不小的,直接就压缩了最后一个盘符(F:),预留出来的一个 阅读全文
posted @ 2013-04-22 10:51 Skysper 阅读(1172) 评论(0) 推荐(0) 编辑
摘要: 首先介绍一下命名空间System.DirectoryServicesSystem.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。该命名空间包含两个组件类,即DirectoryEntry和DirectorySearcher,它们使用 Active Directory 服务接口 (ADSI) 技术。ADSI 是 Microsoft 提供的一组接口,作为使用各种网络提供程序的灵活的工具。无论网络有多大,ADSI 都可以使管理员能够相对容易地定位和管理网络上的资源。System.DirectoryServices 命名空间中的类可以与任何 Ac 阅读全文
posted @ 2013-03-02 00:33 Skysper 阅读(401) 评论(0) 推荐(1) 编辑
摘要: 在这篇文章中,我希望澄清三组概念,它们是:AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAXLINQ / LINQ to SQL / LINQ to XXXLambda Expression / Expression Tree / 匿名方法AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAX这是我见过的混淆最多的一组概念。不过当去年AJAX技术如火如荼,AJAX框架层出不穷,而微软又推出ASP.NET AJAX框架之后,这四个概念之间的混淆也愈发严重起来了。我经常能看到这样的问题: 阅读全文
posted @ 2013-02-24 20:36 Skysper 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 如果把照片直接保存在SQL Server数据库中,微软推荐用varbinary(MAX)字段。下面的代码演示了用C#操作varbinary(MAX)字段的基本方法。1、新增记录 private void btnBrowse_Click(object sender, EventArgs e)//浏览照片 { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "*.jpg(jpg文件)|*.jpg|*.gif|*.gif"; dlg.FilterIndex = 1; if (dlg.ShowDialog()==Dia 阅读全文
posted @ 2013-02-13 22:58 Skysper 阅读(1009) 评论(0) 推荐(0) 编辑
摘要: IComparable定义由“值类型或类实现”的通用的比较方法,以为排序实例创建类型特定的比较方法。成员: CompareTo 比较当前对象和同一类型的另一对象。 IComparer定义类型为比较两个对象而实现的方法。成员: Compare 比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。 从表面看IComparable是排序时使用 IComparer只是比较对于这两个接口可能对于初学者来说易混淆。下面通过示例来来看下IComparable和ICompare的区别(示例中使用IComparable和ICompare接口)对于IComparable接口,它一般是和类绑定.. 阅读全文
posted @ 2013-02-13 22:16 Skysper 阅读(1320) 评论(0) 推荐(0) 编辑
摘要: 直接贴上代码,这是前台的html处理文档<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="tex 阅读全文
posted @ 2011-06-19 02:04 Skysper 阅读(1002) 评论(0) 推荐(0) 编辑