微软最有价值技术专家(MVP),著有《编写高质量代码:改善C#程序的157个建议》,有着十多年的软件从业资历。
1:本篇基于如下的场景 a:主项目只和接口项目相关,如下: 也即,ConsoleApplication1只和IBiz和IDal相关。顺便说一下,为了演示注入,IDal要用到IBiz项目。 b:类结构如下: SampleClass1,SampleClass2,SampleClass3,都继承自IClass 其中SampleClass1构造器依赖注入ISomeBiz的一个实例, 其中SampleClass2属性依赖注入ISomeBiz的一个实例, 其中SampleClass3方法依赖注入ISomeBiz的一个实例。
级联菜单最有名的是省市级联,如果你还没有这样的数据库,请从这里下载Province.rar。 1:MODEL 准备3个Model,如下: public class Province { public int id { get; set; } ...
在上一篇《MVC TIP4:为捕获路由及通用异常处理》里,我们讲了如何捕获MVC WEB站点的未捕获异常,这里我们还要解决一个问题,就是JQuery Ajax异常的捕获。Ajax异常的捕获仍旧需要借助于全局的ErrorController控制器,及其视图,在Views的Error文件夹下的Index视图。
对于未路由到的URL,可以如下处理。 1:首先,准备控制器 public class ErrorController : Controller { public ActionResult Index(string error) { ...
在开始介绍使用JQuery提交表单之前,先看一下非Ajax提交表单的形式,如下: 1:非Ajax 前台: 对应后台: 2:JQuery之Ajax 在介绍使用JQuery提交表单前,我们需要首先引用jquery.form.js,它来自于http://www.malsup.com/jquery/form/,至此,我们需要引用的JS文件有: 功能要求:Ajax提交表单,在控制器HelloWorld4Controller中处理请求,并返回若干数据,数据格式为JSON。
1:简单路由 建立MVC的时候会给我们创建默认的路由,如下: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}",...
1:默认的控制器映射 该控制器映射,可以支撑常规的路径;默认约定是在匹配/Views/controllername/actionname.aspx的目录中查找一个aspx文件。 2:IController接口 所有的控制器最终都是继承自这个接口,一个最简单的控制器: 3:Controller基类 控制器可以有一个唯一的基类为Controller,一个简单的这样的控制器如下: 根据映射,在前台地址输入:http://localhost:52588/Default1/就可以显式Index返回类型的ToString()结果。
在前两篇中,我们讲了在SL端通过Entity Framework和WCF Ria Services实现联表查询,其中最关键的是为实体类中的相关属性设定为Include特性,如下: 遗憾的是,这样的实体Include只能在单个域服务间共享实体。
一:数据库支持 为了演示本例,我们创建了另外一个简单的示例数据库MiniNW,该数据库来自于ADO.NET Entity Framework Extensions,但在本例中,我们不会使用这个针对EF的扩展框架,因为它对POCO的支持不好,同时它也不支持DbContext,简单的说来就是它目前不支持EF4.1。
XAML的调试历来是较为繁琐且不方便的,处理稍有不慎或者初学者通过在VS中手写绑定代码,极度容易写出不规范的绑定代码。所以,我们对于团队成员在此方面的唯一要求就是:使用Expression Blend处理ViewModel绑定。
1:一次只做一件事情 我不具备同时做好多件事情的能力。 2:随身携带一本书 效率最高的学习时间是那些零碎的时间。 3:听身体的 休息的标准是:如果你觉得你是在休息,那你就是在休息了。
对数据库表指定字段的查找,又是实际工作中的一项必要工作。SL客户端仅获取实际需要的指定的字段,好处很多,比如:有助于减少网络流量。 有两类这样的使用场景。 1:联表查询不需要外键表 在上一篇中,我们使用了联表查询,在联表查询中,DAL部分的代码是这样的: 我们已经指出,无论是你是否使用Include方法,只要实体类指定了Include特性,客户端都会获取到被关联的Course记录。
在上一篇中我们对EF中的POCO进行了映射,如果这个时候我们使用主外键来进行联表查询,会很遗憾的发现凡是关联表的信息,在客户端获取的全部是null。 本篇我们介绍如何使用Entity Framework和WCF Ria Services在SL客户端获取主外键联表查询的数据。
1:SL的数据验证和WPF的不同 首先,很遗憾,SL中不再存在ValidationRules,要在SL中绑定时验证数据,并且显示在UI,只能依赖于NotifyOnValidationError=True, ValidatesOnExceptions=True这两个属性,如下: 如果要查看WPF的数据验证的方式,可以查看该文《WPF快速指导5:验证》。
上一篇粗粗讲了一下如何使用EF4.1,针对POCO进行MAP,此篇在此基础上进行一下深入,具体讲一下如何进行映射。 1:主外键中的1对多映射 还是针对School数据库。查看如下两个表: 可以知道,两者的关系是: 也就是说,Department对于Course来说,是1对多的关系。
1:选择测试框架 几乎所有的SL开发人员,都会安装Silverlight Toolkit,如果安装了这个框架,那么自然就会带上一个Silverlight Unit Test Framework。如果安装顺利,我们会在新建项目的时候,我们会在项目模版中发现多了如下一个项目: 同时,如果我们在项目中新建项,会发现多了如下的文件模版: 值得注意的是,安装该模版有一个BUG。
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO》,我们将映射交给edmx文件处理。如下: 该文件是由EF框架自动生成的,通过查看原始文件,我们可以看到EF框架为我们建立了实体类间的各种映射。
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题: 1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。
本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。 Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。
1:项目结构图 2:控件SilverlightControl1 前台: 后台: public partial class SilverlightControl1 : UserControl { public SilverlightControl1(...
本篇讲述使用MVVM来开发用户控件。由于用户控件在大部分情况下不涉及到数据的持久化,所以如果将M纯粹理解为DomainModel的话,使用MVVM模式来进行自定义控件开发实际上可以省略掉M,变成了VVM。
前台: 后台: using System;using System.Collections.Generic;using System.Linq;using System.
MD5或者说HASH值是一种不可逆的算法。如果需要从密文还原成明文,那么就需要对称和非对称这两类可逆算法。 首先,简单介绍下这两类算法。图9-1是对称算法的示意图: 图9-1 对称算法 在对称算法中,首先需要发送方和接收方协定一个密钥K。
继续重构上一篇《Prism安装、MVVM基础概念及一个简单的样例》中的事例,在这一篇里我们将让命令绑定支持带方法参数。这是非常重要的一个编码需求。 为了让本例支持更复杂的应用场景,我们这次要针对一个列表进行操作。
一:Prism的下载和安装 1:在http://compositewpf.codeplex.com/上下载最新的包。 下载完毕后,运行之,选择解压目录解压之。解压完毕的根目录下有chm帮助文档。 2:运行RegisterPrismBinaries.bat注册Prism组件,注册完毕才能在VS的引用中直接找到Prism组件,否则需要手动添加这些组件。
在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如: 1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作; 2: ThreadPool不支持线程执行的先后次序; 以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。
在C#中让线程同步的另一种编码方式就是使用线程锁。所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源。可以用下面这句不是那么贴切的话来理解线程锁的作用:锁,就是让多线程变成单线程。
开发者总尝试对自己的代码有更多的控制。“让那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停。无论采用何种方式通知工作线程需要停止,工作线程都会忙完手头最紧要的活,然后在它觉得合适的时候退出。
所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定。C#中对象的类型分为引用类型和值类型。CLR在这两种类型上的等待是不一样的。我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待。
WPF快速指导15:动画 在WPF或者SilverLight中,所谓动画,就是让一个对象的属性,随着时间而发生变化。动画由时间线(timeline)控制。时间线在C#中的原型为: public abstract class Timeline : Animatable {//省略 } 它是一个抽象类。
WPF快速指导14:变换 变换,也叫变形(transform)。它定义了从一个坐标空间到另一个坐标空间的映射。变换通过矩阵来描述。变换包括旋转、伸缩、倾斜、调动,这些行为都是矩阵变换。用户还可以实现自己的矩阵。
前两期地址: C#高效编程话题集1(每期10话题) C#高效编程话题集2(每期10话题) 本期话题: 1:使用属性还是字段 首先重大区别就是属性实质是方法,所以:1:可以为属性添加代码;2:可以让属性支持线程安全;见effective c#第一版的第一章;3:属性得到了VS编辑器的支持,得以实现自动属性这种功能。
在标准的Dispose模式中(见前一篇博客“C#中标准Dispose模式的实现”),提到了需要及时释放资源,却并没有进一步细说让引用等于null是否有必要。 有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾。
怕忘记,重新记录一下。 有一种提高自己编程能力的好办法,就是看看.net framework的源码是如何写的?我们在追踪bug的时候,也往往需要追踪到.net framework的源码中去。按照如下方法设置vs2010,即可追踪到.net framwork的源代码中去。
需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象; 非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等; 毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那么,就需要让类型继承接口IDisposable。
24、23期:http://www.microsoft.com/china/community/clubs/blogs.mspx 本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。
第一期话题在:C#高效编程话题集1(每期10话题) C#快速成长团队第二期话题来到。欢迎进入C#快速成长团队进行讨论。 1:确保集合的线程安全 如果使用.net4.0,有新的线程安全集合类新的 System.Collections.Concurrent 命名空间引入了多个新的线程安全集合类,可在需要时随时提供对项的无锁访问,并在锁适用时提供细粒度锁定。
要选择正确的集合,我们首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。结合下图,我们看一下对集合的分类。 集合分类 在上图中,可以看到,集合总体上分为线性集合和非线性集合。
近来在小组C#快速成长团队 讨论了若干话题,有些感觉不错,特总结与大家分享。 当然,所谓话题,重点在于进行讨论,是否是最佳实践也属于大家的个人之见。以下观点若有差错,尽情蹂躏。 1:String str1 = “str1”+ 9; 和String str2 = “str2”+ 9.ToString(); 哪个效率高 可以知道“str1”+ 9,在运行时会完成一次装箱行为。
dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不...
迭代器模式是GOF23种模式中的一种,目的是为了提供对集合的遍历。为什么要实现迭代器模式: 假设存在一个数组,我们的遍历模式可能是采用依据索引来进行遍历。又假设存在一个HashTable,我们的遍历模式就可能按照键值来进行遍历。
WPF快速指导13:数据绑定之集合绑定之视图(排序、过滤、分组) 本文摘要:1:为什么需要视图; 2:变更集合; 3:排序; 4:过滤筛选; 5:分组; 1:为什么需要视图 一旦 ItemsControl 绑定到数据集合,您可能希望对数据进行排序、筛选或分组。
一句话:你是否真的了解new, override, virtual 下面代码的结果,如果基类使用接口代替,也是一样的效果。 主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有什么不同; 代码 class Program {st...
WPF快速指导12: 线程处理模型 本文摘要: 1:理解与UI相关的多线程操作; 2:多个窗口多个线程 3:WPF中的多线程异常 1:理解与UI相关的多线程操作 首先来说说传统Winform。
WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别 本文摘要: 1:什么是路由事件; 2:中断事件路由; 3:自定义路由事件; 4:为什么需要自定义路由事件; 5:什么是冒泡事件和预览事件(隧道事件); 1:什么是路由事件 WPF中的事件为路由事件,所谓路由事件,MSDN定义如下: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
好吧,我承认,这是一个反标题,实际的情况是:我找不到一个非用ICloneable不可的理由。事实上,接口ICloneable还会带来误解,因为它只有一个Clone方法。 我们都知道,对象的拷贝分为:浅拷贝和深拷贝。
WPF快速指导6:触发器 本文摘要: 1:属性触发器; 2:数据触发器; 3:事件触发器; Style、ControlTemplate 和 DataTemplate 都有触发器集合。
托管代码中的字符串是一类特殊的对象,它不可被改变的,每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,也就是为该新对象分配新的空间。
Visual Studio 作为一种强大的开发平台,已经提供了非常多的调试手段。但这些调试手段相对来说还是停留在表面上,无非是设置断点、变量查看以及调用堆栈列表等。某些时候我们希望了解更多的东西,尤其是那些被隐藏到背后和运行期的东西,诸如对象运行状态、内存分布等等,这些相对底层的知识可以让我们更好地理解 .NET CLR / JIT 的一些行为。