Fork me on GitHub
使用NHibernate实现CSLA数据层的持久化

在国外网站上看到有一个叫DavidDilworth的人,他将NHibernate和CSLA整合在一起来实现CSLA数据层的持久化。感兴趣的朋友可以去看一看,相关资料下载网址: http://www.codeplex.com/CSLAcontrib/SourceControl/ListDownloadableCommits.aspx  。

最近

文章来源天极网:http://dev.yesky.com/msdn/140/2663640.shtml
在2000年,微软首次发行了一个称为.NET 1.0的产品的测试版本。其时.NET 1.0作为一个类框架,回答了开发者社区特别是Java社区,向微软提出的问题。当时,人们认为微软已经跟不上形势甚至有些落后于时代了。结果,.NET框架的上市使许多人为之叹服,如今大量的开发者都在积极地涌向.NET的怀抱。

  现在,在几年之后,.NET框架的第三个版本又要出现在众人面前。这个紧紧与Windows Vista的发行绑定到一起的发行版本将是一个相当成熟的框架。这个新式框架的侧重点在于,进一步拓宽.NET方案的应用范围。但是,就象其前一个版本一样,.NET 3.0仍然是庞大而复杂。

  一、 .NET 3.0与1.x及2.0版本的区别

  .NET 3.0与1.x和2.0 .NET框架存在一些不同之处。前两个框架专注于允许众多不同的语言与同一类库CLR进行通讯。CLR,从.NET 1.0中开始引入并在.NET 2.0中得到增强,它基于一个相对简单的概念进行工作:通用语言运行时刻模型能够执行任何运行.NET框架的系统中的代码。这对于每一位开发人员意味着,他们不再需要不断地再学习针对不同技术的语言。例如,一个Windows表单应用程序的C#开发者可以把他的这种构建表单的知识用来编写web页面。同样,一个Visual Basic.NET开发者能够在编写移动应用程序与编写web服务之间顺利切换。由CLR担当一个"仲裁者"并实现相应的通讯。

  .NET框架版本3.0在通用语言运行时刻方面并没有改进。许多人对微软在这方面进行指责,但是我认为,没有必要在每次发行中都要对CLR进行改进。这个新发行的框架的重点在于,拓宽这种语言的技术吸引力。

  有关扩展.NET框架方面已经在以前的发行版本中进行演示了。前两个框架发行中推出了使用ASP.NET构建web应用程序的新的方法。随着1.1 .NET框架一同发行的移动.NET版本使得开发人员更为容易地构建智能手机及其它智能设备应用程序。这些框架的设计中总是提供给开发人员极大的可扩展性。图1展示了.NET 3.0框架的栈式结构。


图1..NET 3.0框架结构

  .NET 3.0框架并没有对现有技术作进一步的改进,而是引入了四种基本的新技术:

  · Windows描述基础(WPF)

  · Windows通信基础(WCF)

  · Windows工作流基础(WWF)

  · Windows CardSpace(WCS)

  这其中的每一种技术都将成为开发者用来实施新方案的奠基石。

  二、 Windows描述基础

  Windows描述基础(WPF)无可争辩地成为以上四个新式基础类集中最为有名的。这主要是由于下面两点: 

  · 你最终只能看到一种WPF方案;

  · 人们经常把WPF与Adobe的Flash进行比较。

  ASP.NET在.NET框架的前两个版本发行期间引起了许多开发者的重视,因为你能够清晰地了解你在使用什么工具进行开发。同样,WPF也提供了一种一致的方案来构建编程模型,并且支持使用更为丰富的控件和设计技术来开发Windows程序。一个开发出来的WPF程序最终能够被发行到桌面,Web以及智能设备上。

  WPF的一个有趣的方面就是新式的名为XAML的XML标准编程语言,利用它能够控制对象的布局。正是这种语言导致了与Flash之间的比较。从表面上看,二者极为相似,但是实际上WPF与Flash之间存在相当的不同。Flash是一个成熟的、可控制的、独立于操作系统的封闭式框架。而相比之下,WPF允许你与操作系统及其它.NET框架技术进行集成。Flash和WPF其实是两种非常不同的技术,二者服务于不同的市场需求但又存在一些"边缘交叉"。

  WPF已经提供了一些工具使你用来构建方案。其中,微软的Expression系列工具就包含了一些新的设计工具,它们允许你创建演示程序、网站以及交互式描述。

  三、 Windows通信基础

  Windows通信基础(WCF)的核心目的是,允许程序与同一台计算机或网络上的或跨越互联网的其它程序实现通讯。WCF编程模型把web服务,.NET远程技术,分布式事务和消息队列统一到单个面向服务的编程模型中,从而实现真正意义上的分布式计算。

  WCF的设计在于顺应面向服务的架构原则以支持分布式计算;在这种环境中,服务为消费者所使用,客户可以同时消费多个服务,并且同一个服务能够为多个客户同时消费。典型地,服务都会提供一个WSDL接口,任何WCF客户端都能够使用该接口来消费该服务,而根本不用虑及该服务所宿主的平台。WCF实现了许多高级web服务标准,例如WS-寻址,WS-可靠性和WS-安全性。尽管微软是Web服务互操作性组织(WS-I)的成员之一,但是,问题至今还不明朗-到底微软会全面支持多少WS-I规范。

  四、 Windows工作流基础

  Windows工作流基础(WWF)是一种定义、执行和管理工作流的微软技术。工作流由一系列的活动组成;开发者能够编写他们自己的域特定的活动,然后把它们应用于工作流中。.NET框架3.0/Windows工作流基础还提供了一组涉及若干控制流构建方面的通用目的的活动。

  Windows工作流基础中还包括了Visual Studio 2005扩展。这些扩展包含一个允许用户设计工作流的可视化工作流设计器,一个支持用户调试工作流的可视化调试器,还有一个支持用户在Visual Studio 2005内编译工作流的工程系统。

  注意,你可以在Windows SharePoint Server 2007 Portal的发行中看到一个有关于WWF的早期的示例程序。

  五、 Windows CardSpace

  你是谁?这是一个经常需要解决的问题-而且也是一个令开发者每天都头疼的问题。当前,我们已经拥有了例如活动目录,通行证和Windows会员服务等方案;我们能够通过这些技术并借助于用户名和口令来标识某个人。目前,这些方案中存在的问题在于,它们实质上相当松散而且安全性差。你会经常听到有人能够共享用户名和口令吗?即使当这种情况发生时,你也根本不知道到底被认证的人是谁。

  如今,新的Windows CardSpace在这个问题上提供了一种新的解决方案。不同于以前在管理安全方面的尝试,现在,微软使用CardSpace采取了一种大胆的步骤,从而实现了一种几乎是全新的尝试-向微软以外的安全专家咨询:"安全究竟是什么样的?"

  回答很简单:任何用户都能够创建并且共享他的或她的唯一的身份。Windows CardSpace是这种新方案的微软版本。好消息是,CardSpace工作在与其它公司所开发的相同的原则基础上。微软可能是第一个,但是许多公司也都是基于这一技术的。例如,微软已经发行了展示把CardSpace集成到一个PHP应用程序中的示例代码(仅有200行)。

  CardSpace及相应的新式支持技术将改变你到一个应用程序的认证方式,不管这个程序是基于Web,你的手机或你的桌面程序。这一服务将会真正帮助弄清楚你是谁,而不是由你自己宣称你是谁。在保护用户数据的私有性方面,这的确是一个好东西。

  六、 构建.NET 3.0解决方案

  你可能已经预料到,构建.NET 3.0解决方案的主要工具就是Visual Studio。Visual Studio的下一个发行版本,其当前相应的CTP代码名为"Orcas",预计将于2007年发行。除了开发工具之外,一组新的支持Windows描述基础的设计器工具(冠以名称"Expression")正在发行中。

  总的来看,微软在.NET 3.0背后储存了"大量能量",我估计在2007年将会发行或宣布许多精品工具。 

  七、 集成Vista与Windows XP

  请牢记这一点:.NET框架并非操作系统本身。这个看上去非常明显的结论却随着Windows XP的发行被淡忘了许多。到目前为止,Windows XP已经成为利用.NET框架技术的占优势的桌面OS。.NET 1.x和2.0都被设计可以运行于Windows XP之上。一个容易被人们忽视的一点就是,.NET框架并没有被绑定到某一个操作系统。.NET 1.x和2.0都可以运行于Windows 2000和Windows 2003/R2之上。你所要做的就是利用该框架开发出一个能够运行于多个系统上的应用程序。

  挑战在于,作为一个开发者,利用非特定于OS的框架类进行开发可能是极具诱惑力的。这一点已经从许多Windows应用程序中得到证实,这些程序宣称支持.NET框架但是其实却利用了Windows XP特定的工具,从而使其应用程序仅能运行于一个操作系统之上。事实证明,这里所推荐的许多混合方案无法运行于Windows 2000操作系统上。

  .NET 3.0类似前一个框架的一个地方就是,它能够运行于多个操作系统,例如Windows XP,Windows 2003/R2和Windows Vista等之上。到目前为止,我还未曾听到有关于针对Windows 2000或任何其它Windows操作系统发行.NET 3.0的任何讨论。

  八、 进一步挖掘.NET 3.0宝藏

  就象微软所有以前的.NET框架发行版本一样,当前发行的3.0版本也是重量级的。因此,界时市面上将会出现了许多的有关于介绍每一种基础的书籍,当然还会伴随成百上千篇的文章。这都是将来的事情。今天,有关这方面的消息仍然相当缺乏而且难于捕捉;不过,最值得参考的几个地方有:MSDN,Channel9.com,http://www.netfx3.com,以及针对.NET 3.0.100的官方新闻站点。

  Windows描述基础第一次为设计者提供了一种方案允许其直接与开发者进行交互。如以往一样,开发者还是首先需要进一步学习大量的新技术。最后,.NET 3.0提供了一组基础类用于实现通信与工作流的集成。另外,Windows CardSpace所提供的新的认证方案还有待于商界通过顾客敏感的数据去进一步验证。 

  请睁大你的眼睛用你的智慧去拥抱新的.NET 3.0吧。其中存在许多十分紧迫的技术等待你去进行严肃地分析。当然,最好的办法还是通过试用它来更好地理解.NET 3.0并进而确定如何使用它来构建更佳的方案。

文章来源天极网:http://dev.yesky.com/msdn/35/2707535.shtml
1.隐型局部变量 

  C# 3.0引入了一个叫做“var”的新关键字。这个关键字允许开发者建立一个变量,但不必明确它的类型。例如,用var说明一个字符串,就像这样:


  注意,这里并没有提到myData变量是一个字符串,而C# 2.0却要求这一点。

  虽然var允许您建立隐含的类型,它并没有降低C#浓厚的类型特征。var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。

  例如,这段代码没有作用:


  使用var关键字还会产生一个有趣的结果,它可以帮助开发者减少建立变量时的代码输入。例如,在C# 2.0中建立一个Customer对象,需要输入以下代码:


  使用新的var关键字,则只要输入:

varmyCustomer = new Customer();

  var关键字的另一个特点在于,使用它可以避免改变一个返回某个类型对象的方法调用。例如,在C# 2.0中,如果您需要调用一个返回Customer对象的方法,您应该编写以下代码:


  如果某个时候GetByName方法返回一个不是Customer的对象,这段代码就无法编译。但是,如果应用var关键字,您就不用担心GetByName返回的对象类型。


  现在,因为应用了var关键字,GetByName方法能够进行改变,返回一个Person对象,这个方法调用也依然有效。

  2.extension方法

  在C#中,您不能继承和扩充用访问标识符标记为“封装”的类型。但在C# 3.0中,extension方法允许您扩充任何类,甚至是标记为封装的类。例如,如果希望添加一个NoSpaces()方法到字符串类中,我们要定义一个类似列表A中的extension方法。

  列表A


  在一个类中导入这个extension方法时,开发者就能够对这个类包含的任何字符串调用NoSapces()方法。

  extension方法的第一个参数决定extension方法的有效类型。在这种情况下,“这个字符串数据”(this string data)表明extension方法适用于字符串类;如果extension方法以“这个对象数据”(this object data)为第一个参数,则说明这个方法对每个对象有效。

  要表明您希望导入extension方法,只需在它们的命名空间中包括一个using指令。例如,要应用上面说明的方法,需要在类文件中包括一个using MyExtensionMethods指令:(列表B)

  列表B


  注意extension方法的优先度比instance方法低。因此如果instance方法和extension方法有同样的签名,则应执行instance方法。

3.对象初始化器

  在C# 2.0中,开发者认为建立许多构造器来设定某个属性值为对象初始化过程。下面是一个例子: 类访问Customer方法: 


  Customer类构造器: 


  C# 3.0介绍了一个初始化对象的新方法,它允许您在初始化对象时设定任何属性值。例如,在C# 3.0中,上面的代码块可以写成:

  类访问Customer方法: 


  Customer类构造器: 


  在C# 3.0代码中,没有与初始化对象对应的构造器。这样,开发者就不用为每组需要设定的属性建立不同的构造器。

  这样产生的另外一个效果是:代码变得更容易阅读了。例如,虽然我们清楚知道下面的代码对一个Car对象进行了初始化,但我们并不清楚其中变量的作用:


  一眼看来,下面这行代码更易阅读,尽管我们必须输入更多代码:


  4.匿名类型

  C# 2.0引入了匿名方法,C# 3.0推出匿名类型。匿名类型与匿名方法类似,它们都是以嵌入方式建立,并没有正式的名称。在建立一个匿名类型,您必须组合上述对象初始化器和隐型局部变量两个概念。下面是一个匿名类型的例子:


  匿名类型的范围与任何其它变量的范围相同。例如,下面代码块中的cobra实例仅仅在Speed函数块中有效:


  如果一个匿名类型被初始化而另一个匿名类型位于范围域中,并且它们的签名相同,第二个类型将自己占用第一个类型的类型。例如,在下面这段代码中,cobra和mustang都是匿名类型,并且可以彼此设定。


  5 .LINQ

  在之前的C#版中,开发者应用许多不同的查询语言来访问不同的数据源。例如,要查询一个XML文件,开发者会使用XPath,要查询一个SQL数据库,开发者将使用SQL。在过去这种方法十分有效,并且现在仍然是访问各种数据的主要方法。但是,这种方法具有一些缺点。 一个显著的缺点在于:开发者必须以一种不同的语言,而非他们当前使用的语言(如SQL或XPath)来编写查询代码。另一个缺点是,在执行某些查询语言,如SQL时,开发者必须编写映射代码将查询结果转化为可用的C#业务对象。

  C#3.0推出一种称之为语言集成查询(LINQ)的新方法。应用LINQ,开发者可以编写出能够搜索任何IEnumerable<T>数据源的代码。所以除了应用TSQL访问MS SQL数据库,应用XPath访问XML文件外,他们还可以应用LINQ。

  下面的代码(列表C)是一个LINQ查询的例子,它返回所有OrderCount大于10的顾客:

  列表C


  与SQL或XPath不同,LINQ查询用C#,而非第三方语言编写。这样,查询就不会出现类型问题,开发者也就没有必要编写映射代码把查询返回的数据转化成C#对象,而由LINQ API自动处理映射。

  基本上,在ORM解决方案中,LINQ对象用途很大。同样,它的范围也非常广泛,有大量MSDM信息描述了它的功能。欲了解更多信息,请访问LINQ主页。

varmyData = "This is my data";
varmyDate = DateTime.Now;
myDate = "Hello.";
Customer myCustomer = new Customer();
Customer myCustomer = GetByName("Zach");
varmyData = GetByName("Zach");
namespaceMyExtensionMethods
{
 public static class Extension
 {
  public static void NoSpaces(this string data)
  {
   return data.Replace(" ", "");
  }
 }
}
usingMyExtensionMethods;
namespace MyNamespace
{
 public class MyClass
 {
  public MyClass()
  {
   string data = "this is my data";
   //nospaces will contain "thisismydata".
   string nospaces = data.NoSpaces();
  }
 }
}
Customer myCustomer = new Customer("Zach", "Smith");
public Customer(string firstName, string lastName) : this()
{
 this.FirstName = firstName;
 this.LastName = lastName;
}

public Customer()
{}
Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" };
public Customer()
{}
Car car = new Car(18, 10, 550);
Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 };
varmyType = new { Length = 79, Width = 30 };
private void Speed()
{
 var cobra = new { Horsepower = 550, Torque = 570 };
}
private void Speed()
{
 var cobra = new { Horsepower = 550, Torque = 570 };
 var mustang = new { Horsepower = 300, Torque = 300 };
 mustang = cobra; //or you could say cobra = mustang
}
using System;
using System.Query;
using System.Collections.Generic;

public class SampleClass
{
 static void Main() 
 {
  List<Customer> customers = GetCustomers();
  //Write our query to retrieve customers who have more than
  // 10 orders.
  IEnumerable<Customer> queryResult = from customer in customers
  where customer.OrderCount > 10
  orderbycustomer.ID
  select customer;
 }
}
posted on 2011-03-24 15:26  HackerVirus  阅读(413)  评论(0编辑  收藏  举报