Archive for the .Net Category

模型-视图-呈现器(MVP)

网上有人问MVP设计模式,不是最有价值球员,是Web开发中的一种名词,有很多人介绍这种设计模式,但没有给出中文的说法,这里的P是一个中间人的角色,本人不才杜撰了一个名词:呈现器,MVP也就成了模型-视图-呈现器设计模式,下面是stackoverflow上某人对MVP的解释,虽然说的是Web开发,但对于其他应用也有价值,故这里翻译如下:

原文:http://stackoverflow.com/questions/2056/what-are-mvp-and-mvc-and-what-is-the-difference
翻译:sam sha – ycoder.com

Model-View-Presenter – 模型-视图-呈现器

在MVP中,呈现器包含视图的UI业务逻辑,所有视图的调用直接委托给呈现器,呈现器使用接口与视图对话,避免了与视图的直接耦合,这意味着可以模拟视图组件进行单元测试。MVP中有一个特点,它存在很多个双向派发,比如,当点击“保存”按钮,事件委托呈现器“OnSave”方法,当完成保存,呈现器将通过接口回调视图,这样这个视图可以显示保存已完成。

MVP倾向于一种非常自然的模式实现Web Forms呈现的分离,原因是视图总是被ASP.NET运行器最先创建,你可以找到更多关于两者的资料

Using IsAssignableFrom with C# generics

C#语言提供了很多高级功能,其中就包括泛型(generic)的引入,泛型避免了类型强制转换的麻烦,提高了代码执行效率,但也带来了一些问题,比如增加了代码量,泛型使用太多引起混乱,此外就是今天要说的问题:Type#IsAssignableFrom方法不正确。

问题

比如:typeof(object).IsAssignableFrom(typeof(string));返回true,而typeof(A<>).IsAssignableFrom(typeof(A<string>))返回false。

这个问题导致判断类型这样的基本操作在C#中“没法”实现,默认我们可以用”is”关键词判断对象是否是某种类型,如:

string a = “ycoder”;

Console.WriteLine(a is object);

A<string> aa = new A<string>();

//Console.WriteLine(aa is A<>);//我们无法判断aa是A<>类型,只能判断aa是否是A<string>或者A<int> … 类型

typeof(A<>).IsAssignableFrom(aa.GetType());//return false我们也没法通过aa.GetType()去判断,得到的是false

而如果不是用泛型,得到的是正确结果

typeof(object).IsAssignableFrom(typeof(string));//return true

解决办法

于是寻求解决之道,stackoverflow上也有人遇到相似的问题(Using IsAssignableFrom with generics),但给出的答案经过我测试,有些问题,于是只能自己解决,最终得到下面的两个函数,通过追踪基类(Type#BaseTpe),以及特殊处理泛型类,追踪泛型定义类(Type#GetGenericTypeDefinition())等途径,实现了这一本不该这么费劲的功能:

下面是测试代码:

译:Silverlight vs Flex

有人问Silverlight与Flex技术的比较,正好stackoverflow上有人解答,这里转载过来,加以个人看法
原文:http://stackoverflow.com/questions/20910/silverlight-vs-flex

翻译:sam sha – yCoder.com

我想你应该看到Silverlight是一个长远的项目,就像微软正在做的。如果你从插件的可用率和安装率考虑使用Silverlight vs Flash,两者有明显的平衡,但有下面一些原因让采用Silverlight是一个好的选择

  • 后来者居上 – 就像微软创建了“更好的Java”.NET,他们可以看到你是如何从起步开始设计RIA插件的,今天他们更了解现在人们如何使用web,而这些在当时的Flash发明者是无法准确猜测的,Flash可以添加功能,但它无法抛弃这个平台重新架构
  • 开发者熟悉度 – 虽然Silverlight是一个新的东西,但对于开发者并不是完全陌生的,相比让开发者理解一种新的脚本语言和事件模型的全新编程环境,他们可能更快的适应Silverlight的开发方式。
  • 摆脱Flash的时间线模型 – Flash最初是建立在帧基础的动画,虽然有办法抽象这种方式,但这是Flash工作的核心,Silverlight则采用应用程序为中心的模型,避免了这种缺陷。
  • ScottGu – ScottGu(这个家伙写了不少Silverlight相关的文章,算是微软的传教士,他有个网站 - scottgu.com)让Silverlight火起来了,无需多言
  • 很酷的新功能 – Silverlight也提供了一些Flash中常用的功能(比如摄像头、麦克风,或者3d、图形加速),Silverlight中还有一些独一无二的新技术 – 深度缩放就是一个例子,在Silverlight中我正看到更多革命性的技术,而在这一点上,Flash似乎处于维护模式。

译:Silverlight 5 RC 发布了

原文:http://10rem.net/blog/2011/09/01/silverlight-5-rc-now-available
翻译:sam sha – ycoder.com
备注:虽然Silverlight开发起来很费劲,但是微软在技术方面很是很牛的,就是用户体验错的太差

我很高兴的宣布,Silverlight 5 发布候选版本在太平洋时间今天(2011.9.1)上午10点(服务器复制链接和内容可能需要几分钟)可以获取了,赶紧上Silverlight.net的下载页面获取和使用吧,这个RC版本只是一个开发版本(不是正式上线的许可),旨在让你了解年底将发布的正式版本,使用这个发布版本取更新你的 SL5 beta 代码,使用名称空间和引用变化,使用新的功能,这不是最终版本,所以请使用和测试它,提交你找到的Bug,此外除了beta版本中的功能外,这个版本还包含更多很酷的功能:
  • P/Invoke 支持调用本地函数
  • 64 位支持 (yay!)
  • 矢量 (Postscript) 打印
  • 远程控制和多媒体命令支持
  • DataContextChanged 事件
  • In-Browser Trusted Applications浏览器信任应用程序
  • PivotViewer 控件(译者备注:这个组件很酷,详见 http://www.silverlight.net/learn/data-networking/pivot-viewer/pivotviewer-control)
  • 多媒体程序的电源感知(比如当播放电影时保持PC不待机)
此外,我们对一些XNA名称空间和文件位置做了调整,你会发现很多3D的东西被转移到不同的DLL,我们还修改了链接文本功能,使用只读 RichTextBlock而不用可编辑的RichTextBox,我已经更新了这些修改的公告和源码下载。再回头看看Silverlight 5 beta中其他功能的信息,这里有些我的 beta 版公告,RC版本又做了修改:

译:《Professional C# 4.0 and .NET 4》 第一章 .Net体系架构(3 over)

以下内容原文见《Professional C# 4.0 and .NET 4》 -> Part1: The C# Language -> Chapter 1: .NET Architecture
原文作者:Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner
翻译:Sam.Sha – ycoder.com
备注:只翻译UI技术相关的,不包含ASP

使用C#创建应用程序

你可以使用C#创建控制台程序:运行于dos窗口的纯文字应用程序,这种程序可以用于单元测试或者类似UNIX或Linux中的守护程序。但通常,你可以使用.NET技术创建出更丰富的应用程序,这个章节我们就概要的介绍这些不同类型的应用程序

Creating ASP.NET applications  - 创建ASP.NET应用程序

using the Windows Presentation foundation (WPf) - 使用WPF( Windows Presentation foundation)

这块儿最新的技术是WPF( Windows Presentation Foundation),WPF使用XAML组件应用程序,XZML的全称是:可扩展的应用程序标记语言,这是微软体系中的一种全新的创建应用程序的方式,在2006年作为.NET Framework 3.0, 3.5, 4的一部分被引入,这意味着要运行WPF程序需要客户端安装.NET Framework 3.0以上版本,目前支持WPF应用程序的操作系统有Windows XP, WIndows Vista, Windows 7, Windows Server 2003, Windows Server 2008。

XAML是一种XML表述方式,用于创建WFP程序中所有可见的部分和行为,当然使用编程的方式也可以创建WPF程序。WPF采用的这种声明式编程方式,是行业的发展趋势,声明式编程椅蹲湃〈ü嘁胗镅裕–#,VB或者Java)编程创建对象,而可以通过XML编程方式声明任何的东西,35章“Core WPF”中将详细介绍使用XAML和C#的这些全新类型的创建应用程序的方式。

Windows Controls - Windows 控件

译:《Professional C# 4.0 and .NET 4》 第一章 .Net体系架构(2)

以下内容原文见《Professional C# 4.0 and .NET 4》 -> Part1: The C# Language -> Chapter 1: .NET Architecture
原文作者:Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner
翻译:Sam.Sha – ycoder.com
备注:只翻译UI技术相关的,不包含ASP

程序集

一个程序集是个逻辑单位,包含了针对.NET Framework编译的代码,本节不会详细介绍,在第18章“Assemblies”会作全面的说明,这里只作主要点概要

程序集完全是自描述的,他是一个逻辑单位而不是物理单位,也就是说他可能被存放在多个文件中(实际上,动态程序集存放在内存中而不是文件),如果一个程序集存放在多个文件中,其中有一个主文件包含了入口和其他程序集文件的位置

注意可运行代码和库代码都使用了相同的程序集结构,他们唯一的区别是,可执行程序集包含了一个主程序入口,而库程序集没有。

程序集的一个重要特征是,它既包含了对应代码的类型方法元数据描述,也包含了程序集自己的元数据描述,程序集元数据包含在被称为程序清单的位置,允许检查程序集版本和完整性。

ildasm, 一个基于windows的实用程序,可以用来检查程序集的内容,包括程序清单和元数据,ildasm会在18章节做介绍

译:《Professional C# 4.0 and .NET 4》 第一章 .Net体系架构(1)

以下内容原文见《Professional C# 4.0 and .NET 4》 -> Part1: The C# Language -> Chapter 1: .NET Architecture
原文作者:Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner
翻译:Sam.Sha – ycoder.com

第一部分:C#语言

第一章:.Net体系架构

本节内容:

.NET中编译和运行代码
微软中间语言的优势
值类型引用类型
数据类型
理解异常处理和属性
程序集,.NET基础类,名称空间
通过本书,我们强调C#语言需要结合.NET Framework考虑,而不是孤立的看待,C#编译器是专门针对.NET的,这意味着所有C#编写的代码总是运行在.NET Framework中,这对于C#语言有两点重要影响:
1、C#的架构和方法反映了.NET底层的实现方法
2、在许多情况下,C#的语言特性实际上依赖于.NET的特性或者.NET的基础类
因为有这样的依赖性,有必要在学习C#编程之前理解.NET的体系结构和方法,这是本章的目的

C#与.NET关系

C#是一种相对较新的语言,具有两方面特点:
1、是特别针对微软.NET Framework设计的语言
2、是一种基于面向对象设计方法的语言,在设计它时,微软借鉴了所有其他相似的面向对象的语言
有一件重要的事情要说明,C#语言有他自己的规则,虽然他被设计用于.NET Framework,但他本身并不是.NET的一部分,有些.NET支持的功能,C#并不支持,你可能感到奇怪的是有些C#支持的功能.NET也不支持(如某些操作符的重写),但是C#语言的目的是用于.NET的,如果你想有效的使用C#开发程序你需要了解这个架构,因此本章将花点时间探究.NET底层的样子,让我们开始吧。

通用语言运行器

.NET Framework的核心是它的运行执行环境,也就是通用语言运行器(CLR)或者.NET运行器。在CLR控制下运行的代码通常称为托管代码。
但是,在被CLR执行之前,任何你编写的代码都需要被编译,编译有两步:
1、编译成微软中间语言(IL)
2、IL由CLR编译成跨平台的特殊代码

ViewModel 设计模式

http://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx

http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx

05年的文章,简单翻译,很烂见谅

MVVM是MVC的变种,为UI设计师提供便捷,远离纯粹的编码。设计师是图形化更艺术化的人,更喜欢用所见即所得的方式。简而言之,程序的UI部分需要
其他人用其他的工具和语言生成,而不同于后台业务逻辑和数据。MVVM是对起源于Smalltalk这样的整个应用程序使用一种语言的MVC设计模式的改
进,以适应现在的复杂灵活的Web开发环境的需求。

Model.View/ViewModel还提出了数据绑定的概念,之后会介绍。

Model还和MVC中的一样,表示业务模型和数据,独立于UI,用于解决主要问题。Model用代码或者纯数据描述

View包括可视化组件,按钮,窗口,图形和混合组件,它包括快捷键以及组件自己的交互操作。UI通常是用工具生成或者是描述性的语言描述的,MVC模式
中View的多种状态不容易表现,如编辑模式查看模式,不同模式下组件的行为交互是不同的,这些模式不能总定义在XAML中,我们将解决这个问题。
这时候数据绑定出现了,举例,View是Model数据的绑定,一些Model只是简单的查看,之需要单向绑定,其他需要双向绑定,如一个Boolean
值可以绑定的CheckBox中也可以与一个TextBox绑定。
实际上,只有少数的应用程序中View是能直接与Model绑定的,尤其是如果这个这个Model是已经存在的类或者数据结构,而且他已经在其他应用程序
中多处使用,这个Model可能有数据类型但没法直接与组件关联。UI可能需要复杂的转换,这些代码既不能算是View,也不完全属于Model,最后我
们还需要给选中模型,模式给个合适的位置。
ViewModel的提出就是因为这些原因,这个术语可以被认为是View的抽象,也可以理解为专用于View数据绑定的特殊模型,ViewModel包
括数据从Model类型到View类型的转换,也包括视图命令和交互。
我将以这种思想,在以后的文章中详细描述数据绑定视图命令行与ViewModel,这里先用些例子快速的理解这种模式。

上图中显示了Sparkle
UI中的三个编辑面板,都是使用的MVVM的设计模式,上面的是一个组件库面板,Model是一堆assemblies,每个assembly又有一堆
controls,View是一个ComboBox和一个ListBox,ComboBox直接绑定assembly集合,显示assembly的名
称,ListBox绑定其下的子项。这里的ViewModel包括当前选中的Assembly和插入组件到场景中的命名行。选中模型是ViewModel
中常用的一部分,,但是当组件被选中,你可能会疑惑为什么不让View自己控制选中模型,这是因为通常多个组件需要同步选中,在ViewModel中简单
的绑定选中模型,就可以以很容易同步给多个View,在这个组件库面板中,选中的Assembly决定了ComboBox选中的Assembly,也决定
了ListBox中的数据。此外,界面设计者可以改用ListBox呈现Assemblies,用ComboBox呈现组件集合,而不需要修改选中同步代
码。
视图面板也有自己的模型(编辑区域中的选中图形和组件),View包括一个ListBox(用于显示选中组件的相关属性),控制画笔的按钮,渐变按钮,颜
色拾取组件,以及设置画笔的命令行。