随笔分类 - .NET/C#
有关.NET/C#的技术文章
摘要:在DDD中,实体(Entity)、值对象(Value Object)和服务(Service)是领域模型的基本元素;而数据传输对象(Data Transferring Object,DTO)只负责保存数据,以便数据在层与层之间进行传递,这是前两者与DTO的主要区别。理解实体与值对象 实体是我们在做开发的时候经常遇见的领域对象,比如上文成绩管理系统中的“学生”就是一个实体,因为...
阅读全文
摘要:简单的说,软件开发的目的就是通过计算机解决某一领域的实际问题。这样的定义已经将我们的立足点置于领域层面了:我们需要关注的是领域本身,而不是其它的技术细节。很多人拿到需求,很喜欢从建立数据模型开始,画出数据模型图、ER图,考虑数据库表的结构,以便开始软件设计。比如,假设现在要设计一套简单的学生成绩管理系统,就管理学生各科的成绩,我们都会毫不犹豫的设计三个数据表:Students(用于保存学生信息)、...
阅读全文
摘要:用于在.NET下快速开发控制台应用程序的Adaptive Console Framework框架再次有了新的版本(版本号:3.5.3286.17617)。有兴趣的朋友可以点击这里直接下载安装包使用。与上一个版本(版本号:3.5.3253.15384)相比,最新版具有如下几个更新:将框架DLL、演示程序和文档分别打包发布,允许用户根据自己的需要下载ACF的相关组件。针对初级用户提供了InstallS...
阅读全文
摘要:最近在看一些.NET Ajax的东西,发现一个小问题,就是当我在将TextBox的ReadOnly属性设置为true的时候,使用CalendarExtender后无法获得TextBox.Text的值。 在选择日期的时候,不允许用户修改TextBox里的值,这是比较常见的一种做法,目的是不希望再对用户的输入做进一步的格式验证。请看下面的代码:view plaincopy to clipboardpr...
阅读全文
摘要:在软件系统的整个开发过程中,需求分析是非常重要的一个环节,这一点大家都知道,这句话估计很多人都能脱口而出;然而在实际应用中,却往往容易被人忽视。为什么会出现这种情况呢?我想这也是可以理解的。理论毕竟是理论,与实际应用会有所偏差。比如一些外包项目,由于时间的紧迫,团队必须在较短的时间里做出最快速的反应,如此一来,诸如需求分析、文档管理等过程就会出现混乱,甚至是“避而不谈”,等...
阅读全文
摘要:从本文开始,将会有一系列的文章介绍领域驱动设计在.NET中的实践,并探讨在.NET环境中实践领域驱动设计的最佳操作。领域驱动设计是一种新兴的软件设计思想,它不是理论,不是圣经,而是前辈多年来实践经验的总结。与模型驱动相比,领域驱动更关注领域,在架构大型软件系统方面,领域驱动设计更具有指导意义。 Eric Evans在他所写的《领域驱动设计:软件核心复杂性应对之道》一书中,详细地介绍了与领域驱动设计...
阅读全文
摘要:前段时间在网上看到了一款在WLW中插入语法高亮代码的插件,叫做Highlight4Writer,试用了一下,能够完成基本功能,但有一些不尽人意的缺点:1、插入的代码行间距太大,看起来不舒服,一页只能显示少量代码;2、支持的程序语言有限,无法自己定制;3、语言语法高亮颜色无法自己定制;4、无法显示行号。针对这些问题,我借用SyntaxBox的支持,自己开发了一款在WLW中插入语法高亮代码的插件。 下...
阅读全文
摘要:在一个星期不到的时间里,空闲之余仍然摆弄着Visual Studio 2008,反正一直都在感叹Visual Studio的强大功能,也一直在考虑一些有关用.NET构造大型企业级应用的基础问题。今天,暂且不提什么大型企业级应用,这也不是短时间能够思考清楚的,先拿Visual Studio 2008做些小东西,为Windows Live Writer开发一个插入计算结果的插件吧。 在我们平时写博客的...
阅读全文
摘要:上文已经提到接口的基本知识,以及如何从面向对象的角度去认知接口与抽象类的联系和区别。本文将从另外的一些技术角度来继续讨论接口和抽象类的取舍问题。首先,在C#中,一个类仅可以继承于一个基类(可以是抽象类,也可以是普通的非密封类),但是它可以实现多个接口。因此,当某个类需要同时拥有多种不同的操作时,封装这些操作的类型就不得不被定义为接口。例如,“学生”实体本身可以根据年龄来比较...
阅读全文
摘要:为了将问题描述清楚,我们先来看一个例子。在这个例子中,WinForm上有一个按钮,当用户点击这个按钮后,就会装载一个已经存在的Assembly,并且在界面的Label控件上显示出这个Assembly的FullName。对Reflection稍微熟悉一点的朋友都知道,这是非常简单的事情,只需要用Assembly.LoadFile方法获得Assembly,然后用FullName属性来显示即可,比如下面...
阅读全文
摘要:经过一个多月的努力,用于在.NET下开发控制台程序的框架ACF终于有了新的版本。ACF简化了.NET下具有复杂命令行语法的控制台程序的开发过程,不仅使得控制台程序具备可测试性,而且开发人员还能够非常方便地向控制台程序发布新的命令行语法。本次版本更新涉及到了下面几个方面:性能优化支持多个“契约仓储(Contract Repository)”,以使得控制台程序有着良好的扩展性支...
阅读全文
摘要:原本我一直是使用Windows Live Writer(WLW)在自己的英文博客上发布文章,在将博客换成中文的PJBLOG后,我也就没有再使用WLW了。今天我重新打开了WLW,尝试着配置以便能够支持PJBLOG。结果发现,WLW确实能够很好的兼容PJBLOG,而且图片的发布也非常方便,这对于广大博友来说,无非是一个很好的消息,WLW也能够满足广大博友的写博需求。然而,对于我这个时不时会在博客中加入...
阅读全文
摘要:事件定义的时候,可以使用add和remove关键字来自定义事件处理函数的添加与移除功能。例如,可以在添加和移除之前,使用lock关键字实现线程同步。虽然MethodImplAttribute会用当前类的对象作为同步对象实现线程同步,但当对象需要向外界公布多个事件的时候,这样做会产生效率问题。比如:对象A向外界公布了E1、E2两个事件,订阅方O1使用+=运算符试图订阅E1事件;订阅方O2也使用+=运...
阅读全文
摘要:在此把平时经常去的学习C#和.NET的地址链接整理一下,当然也还包括其它不错的站点,也会列举在此,以作必要时参考(不断更新中)。CodeProject:http://www.codeproject.com,不仅仅是学习C#/.NET,它还包括了诸如C++、COM等其它技术的内容CodePlex:http://www.codeplex.com,MS支持的开源网站,有N多源代码可供下载或参考。本人写的...
阅读全文
摘要:在讨论事件订阅之前,我们先来看看委托的另一个特性,即调用列表(invocation list)。对于某个特定的委托而言,我们既可以将其它的委托加入其调用列表中,也可以从其调用列表中将其它的委托移除。那么当程序使用这个委托的时候,就会循环遍历并执行其调用列表中的所有委托。下面请看一个例子,在这个例子中,我们定义了一个委托Callback,并将指代两个函数Func1和Func2的委托依次加入其调用列表...
阅读全文
摘要:ACF(Adaptive Console Framework)是一款.NET下的控制台程序开发框架。控制台程序不是非常简单吗?还需要开发框架干什么?当你回答完下面的问题以后,你就会发现,原来自己也需要一套合理的控制台程序的开发方案。控制台程序都提供命令行参数以及参数值,是否每次开发的时候,都需要去解析用户给定的参数?如果控制台程序需要提供多种参数组合,那么要针对每种参数组合开发一套解析机制,是否感...
阅读全文
摘要:上篇文章介绍了C#中事件的基本实现方式,在本文中,将对最常见的事件委托EventHandler和EventHandler<T>做介绍。事实上,在前面文章的介绍中,已经涉及到了EventHandler和EventHandler<T>。在C# 2.0泛型出现之前,EventHandler对C#中最常见的事件处理函数进行了签名定义,它指代了这样一些函数,这些函数没有返回值,有两个...
阅读全文
摘要:前面简要介绍了委托的基本知识,包括委托的概念、匿名方法、Lambda表达式等,现在讲讲与委托相关的另一个概念:事件。事件由委托定义,因为事件的触发方(或者说发布方)并不知道事件的订阅方会用什么样的函数名称,这个函数名称由订阅方自己决定。假如不这样做,那么事件的订阅方必须公开一个专门用于处理事件的函数给事件触发方,由触发方在事件触发的时候调用这个函数。这样一来,触发方必须知道订阅方的细节,才能有效地...
阅读全文
摘要:今天弄到了一份Visual Studio 2010 CTP的虚拟机,是微软官方发布的。解压后虚拟机的磁盘大小估计有25GB,需要内存1GB,因此你的机器配置至少要2GB的内存,才能比较流利地体验2010。该虚拟机所使用的操作系统是Windows Server 2008。在完成第一次运行的配置后,崭新的Start Page映入眼帘:基本界面现在开始新建一个Console Application。在&...
阅读全文
摘要:从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算&ld...
阅读全文