Soma的博客中文版

Somasegar's WebLog - 原文地址http://blogs.msdn.com/somasegar
随笔 - 122, 评论 - 138, 引用 - 3

导航

关于

Soma是微软全球副总裁,负责微软公司Developer Division的工作。 微软DevDiv上海团队将Soma的网络日志翻译为中文,在这里与大家分享.

每月存档

最新留言

广告

【第1页/共9页,122条】
首页
前页
1
2010年01月14日

[原文发表地址]:Entity Framework in .NET 4
[原文发表时间]:Monday, January 11, 2010 9:26 PM

自从Entity FrameworkEF)第一版本的发布以来,我们陆续从用户那里得到了许多高质量的反馈。根据这些反馈,在.NET 4中,我们为Entity Framework添加了许多新的功能和改进,下面我们就来一窥Entity Framework 4中的新特性。

外键支持(Foreign Keys

Entity Framework添加了对外键的支持。利用外键关联,您现在可以将外键属性包含在实体里,这样做可以简化诸如数据绑定、n-tier开发等关键方案的开发。您可以直接使用外键属性设置实体之间的关系:

    using (BlogEntities ctx = new BlogEntities()) {

        Post myPost = new Post {

            PostID = 102,

            PostName = "Post Title",

            CreatedDate = DateTime.Now,

            PostContent = "Post Content",

            BlogID = 11

        };

        ctx.Posts.AddObject(myPost);

        ctx.SaveChanges();

    }

在这个例子里,即使BlogID == 11的这个Blog对象从未被装载,我们也可以直接把新建的myPost对象与这个Blog对象之间的关系通过外键关联起来。

延迟加载支持(Lazy Loading

现在Entity Framework支持延迟加载。一个新的模型在VS2010中被创建的同时,提供延迟加载功能的实体也被生成出来。默认情况下这个功能是开启的,一个查询操作返回的实体对象并不会被马上加载,而是会在实际被使用的时候加载。举例来说,延迟加载意味着下面这个代码段里,每个Post对象会在实际被调用来打印PostName属性的时候被加载。

 

    using (var ctx = new BlogEntities()) { 
        foreach (var b in ctx.Blogs) { 
            Console.WriteLine(b.BlogName); 
            //请注意我们并未主动装载当前blogposts 
            //EF会为我们延迟加载 
            foreach (var p in b.Posts) 
                Console.WriteLine(p.PostName); 
       
    }

简单传统CLR对象(Plain Old CLR Object)支持

EF4为实体提供了简单传统CLR对象(Plain Old CLR Object / POCO)支持。您的实体对象可以独立于EF存在,由此EF更好地支持了测试驱动开发(test-driven development)和领域驱动设计(domain-driven design)。同时,EF仍旧可以帮助跟踪POCO实体的变化,允许延迟加载,也会自动修正对导航属性(navigation properties)和外键的改动。您可以在ADO.NET的博客找到更多关于POCO支持的信息。

文本模板转换工具集(Text Template Transformation Toolkit)代码生成

Entity Framework的初始版本中,您无法随心所欲地配置EF的代码生成,而且代码生成的配置也没有集成到Visual Studio中。新版本的Entity Framework利用文本模板转换工具集(Text Template Transformation Toolkit / T4)不但简化了代码生成的个性化配置,也使得用户对代码生成有更加灵活和强大的控制。Visual Studio集成了这一功能,您可以在Entity Framework设计器的空白处右击,选择“Add Code Generation Item…”。随后您可以获得内置的代码生成模板。

image

当然,您并不局限于这个随着VS2010一起发布的默认代码生成策略,您现在可以编写自己的 T4 模板或者修改默认模板,使之生成您想要的代码。

更好的N层设计(N-Tier支持

我们经常需要分离数据层、业务逻辑层、交互层,来确保数据的完整性并提高每层的可维护性。这时候我们要用到N-Tier设计。Entity Framework小组收到了一些改进N-Tier支持的要求,他们采纳了这一建议,增强了API以支持N-Tier设计。除此之外,EF小组实现了一个代码生成模板,能够生成内置N-Tier特性(如更改追踪)的对象。这个模板生成的实体,本质上是一系列的CLR类,它们带有Windows Communication FoundationWCF)序列化属性,因此它们可以与WCF服务一同使用。

改进SQL语句的生成

我们持续不断地努力改进生成的SQL语句的可读性和性能。在EF4中,针对使用Entity Framework进行的查询,在生成SQL语句的部分我们作出了大量的简化和改进。其中之一是我们去掉了一些多余的join语句。另一个改进是对于WHERE语句的字符串参数使用数据库的通配符。例如下面的LINQ查询语句会被翻译成一个使用WHERE子句和LIKE语句,并使用‘%’通配符在所有的Blogs里搜索BlogName属性‘Visual Studio’开头的Blog

    var query = from b in ctx.Blogs 
                where b.BlogName.StartsWith("Visual Studio"
                select b;   

这些改动看起来好像很小,但改进的SQL生成能够使得查询执行得更快,减轻SQL Servers和网络的负载。

增强对存储过程(Stored Procedure)的支持

许多数据库都利用存储过程来执行自定义的SQL过程。Entity Framework允许您在实体模型中创建一个函数,从中调用一个存储过程。您只需要通过函数导入(Function Import)功能就可以将存储过程导入为一个函数。在新版本中,函数导入功能可以检测到存储过程返回的数据列,并为这些列创建一个复杂类型。当然,当存储过程定义改变后,已有的复杂类型也可以被更新。下面这个截屏显示的是Entity Framework设计器的存储过程向导,引导您一步步将存储过程导入为函数:

image

Entity Framework 4提供的这些新特性,目的是提高程序员的工作效率。您可以在项目论坛上与团队分享您的想法和意见,在Entity Framework团队博客设计博客上与他们联系,也请关注Channel 9上的视频和screencasts

Namaste

posted on 2010-01-14 15:25:13 by Soma  评论(0) 阅读(2203)

 
2009年12月23日

[原文发表地址]:Reactive Extensions for .NET (Rx)
[原文发表时间]:Wednesday, November 18, 2009 8:05 AM

我非常高兴的宣布 .NET 的 Reactive Extensions (Rx) 预览版在MSDN DevLabs发布了。

使用Rx, 程序员能够基于我们所熟知的.NET风格和模式编写的简明的声明式代码,来设计和协调异步的和事件驱动的程序。Rx 具有坚定的理论基础,使用传统迭代(Iterator)和观察者(Observer)设计模式之间的二元性来简化异步控制。通过把LINQ的表达方式与范畴论的优雅相结合,Rx 允许程序员不用理会那些使人痛苦和不自然的行为就可以编写异步的代码。

顾名思义,反应式的程序对所在运行环境中的变化做出反应,传统上,程序员使用锁和事件句柄来协调这些变化。Rx 像push-based,或observable、集合一样为异步计算和事件建模,因此它扩大了标准LINQ 顺序运算符和扩展方法的范围,并超越了我们熟悉的基于拉的(pull-based)、或枚举、集合,进入了反应式编程领域。

实际实践

.NET的Reactive Extensions包含一系列扩展方法和为.NET 4及Silverlight 4中新加入的 IObservable<out T> 和 IObserver<in T>接口实现的LINQ标准顺序运算符。加入到.NET中的Observable接口为基于推(push-based)的通知提供了一个公共接口,并能够基于此创建.NET的一些其他功能和类库。Rx致力于事件驱动和异步计算的协调和策划,并且采用新的任务并行库作为它内部的并发机制。

Reactive Extensions可以在任何.NET语言中使用,在F#里面,最有价值的就是.NET事件。它实现了IObservable<out T>接口。除此之外,F#还提供了一些基本的函数来构造observable集合,并且F#开发人员可以使用Rx获取更加丰富的运算符来构造事件和其他observable集合。

Silverlight工具箱利用Rx为其工具箱的拖放框架提供支持,它使用一套WPF API的子集来初始化拖操作和负责与它交互。拖放框架为一些核心的控件比如Treeview, DataGrid, ListBox增加了拖放操作的支持.允许拖放操作以声明方式来描述。这在很大程度上减少了开发时间。 Silverlight异步的创造可视元素,因此我们通常需要编写异步测试代码来确保一个组件已经被正确的创建。Silverlight 单元测试框架提供的Rx功能允许开发人员编写可靠的事件处理代码而不用牺牲代码的可读性。

示例代码

下面的例子展示了一个简单的AJAX风格的反应式程序,它使用Bing的翻译服务来翻译英文并显示结果。

Rx[1]

上图页面中的输入框设计为一个可观察的字符串集合,当用户暂停输入半秒钟左右,可以从中取得相应的字符串值。GetKeyUpEvents 扩展方法将.NET 的KeyUp事件暴露成一个可观察的集合。

    IObservable<string> words = (from keyup in Input.GetKeyUpEvents() select Input.Value).Throttle(TimeSpan.FromSeconds(.5))

要访问Bing的翻译服务,我们只使用了一个简单的WCF服务引用。这个服务在一个函数中使用了标准的.NET BeginInvoke/EndInvoke 或事件驱动模式。而该函数通过Rx提供一个标准辅助函数返回一个Singleton的Observable集合。

    IObservable<TranslationResponse> Translate(this string text, string sourceLanguage, string destinationLanguage){…}

不同计算之间的协调工作使用了LINQ查询语句,通过发送请求到Bing的翻译服务将每一个词翻译成荷兰语、法语和西班牙语,然后使用一个连接(Join)模式等待其中最先完成的2项结果返回。

    var translations = from word in words

    let dutch = Bing.Translate(word, "en", "nl")

    let french = Bing.Translate(word, "en", "fr")

    let spanish = Bing.Translate(word, "en", "es")

    from results in Observable.Join

                 ( dutch.And(spanish).Then((d, s) =>  
                     new { Dutch = d, French = Bing.NoResult, Spanish = s })

                 , dutch.And(french).Then((d, f) =>
                     new { Dutch = d, French = f, Spanish = Bing.NoResult })

                 , french.And(spanish).Then((f, s) => 
                     new { Dutch = Bing.NoResult, French = f, Spanish = s })

                 ).Until(words)

    select results;

最后,我们订阅这个翻译结果并且一旦收到变化通知我们就更新用户界面。

    translations.Subscribe(result =>

    {

        Dutch.InnerText = result.Dutch.GetTranslatedTerm();

        French.InnerText = result.French.GetTranslatedTerm();

        Spanish.InnerText = result.Spanish.GetTranslatedTerm();

    });

开发人员不必担心要在正确的线程里执行订阅服务,Rx运行时会负责照管这些。

更多有用的东西

除了为Observable集合提供扩展方法,Rx也包含了一系列的试验性的类型和名称空间给开发人员试验,它们为基于枚举的Observable集合实现了一些新的扩展方法,并为.NET 3.5提供了一个试验性的PLINQ。

现在就用吧

你可以从Dev Lab 下载Rx 。别忘了在项目论坛告诉我们你的想法哦,还可以去Channel 9看相关视频

Namaste!

View article...

posted on 2009-12-23 09:13:23 by Soma  评论(0) 阅读(1782)

 
2009年12月22日

[原文发表地址]:Building Applications for Windows Azure
[原文发表时间]:Tuesday, November 17, 2009 11:30 AM

将您的应用或服务构建在云端服务上, 可以让程序员专注开发有用的软件, 使用已经熟练掌握的技术, 而将体系架构、硬件和服务管理等细节交给其它专业人士管理操作。

Windows Azure是微软为了基于云的应用而提供的平台,在去年我们发布了它的CTP(社区技术预览版),而Visual Studio也从第一个CTP版本就支持了Windows Azure应用的开发——您只需要安装Windows Azure Tools的插件即可。您可以通过Web Platform Installer获得在VS 2008上安装的插件。Visual Studio 2010 Beta 2同样支持所有的开发开发,调试,和部署功能,您可以利用它构建您的云端服务。

Windows Azure允许您构建可靠、高质量、并且可以部署和维护的应用程序,随着2009年11月发布的Visual Studio插件, 您可以更加有效地利用Windows Azure平台。

快速入门

开发Windows Azure应用非常类似于开发ASP.NET应用并部署到IIS和Windows Server。尽管有一些区别,Visual Studio还是使得您可以很容易地快速入门。

使用Visual Studio做云端开发,您会注意到的第一件事,恐怕就是Start Page上面,Get Started这个标签页里面对Cloud的介绍了。这个页面提供了丰富的、覆盖面极广的资源,比如Windows Azure社区的链接,定期更新的关于新功能和服务的链接等等。通过这个页面,您不但可以了解到如何创建您的第一个云端应用,也可以在随后的开发过程中获得帮助。

clip_image001

Cloud Service这个项目模板是Visual Studio 2010(和Visual Web Developer 2010 Express)安装的一部分。您可以利用这个模板创建自己的云端服务。点击File | New | Project...菜单,打开Visual Basic或Visual C#选项,选择Cloud Service节点。随后您会看到名为"Enable Windows Azure Tools"的项目模板。

clip_image002

这个模板是Beta 2里面的新功能。通过它,您可以轻松获得最新的工具来开发Windows Azure服务。在创建了项目之后,模板会将您引导到Windows Azure Tools的下载页面。这个步骤能够保证您获得支持最新版本Windows Azure的工具。

clip_image003

在工具安装完成之后, New Project对话框里就会显示Windows Azure Cloud Service的选项。从这时起,Visual Studio就开始支持创建、编辑、构造、调试和部署这些服务。

要创建一个新的工程,选择File | New | Project...菜单来打开New Project对话框,选择Visual Basic或Visual C#节点下面的"Windows Azure Cloud Service"。随后开启的对话框帮助您在您的云端服务中添加Windows Azure Role项目。

clip_image002[1]

Windows Azure的特性之一就是可以跨任意数量的实例,独立地进行规模的放缩。Windows Azure把“components”分割成Roles,Role而一个Role就是一个独立的可放缩在云端运行的部件。每个Role的实例对应一个虚拟机实例。Role分为两种:

· Web Role – 这种Role指的是一个在IIS上运行的网络应用,可以通过HTTP及/或HTTPS端点访问。

· Worker Role – 这种Role指一个后台运行应用程序,运行任意的.NET代码。它可以暴露外部或内部的端点。

无论您想添加哪种Role,我们都提供多个模板选项。比如说,对于Web Role,您可以选择ASP.NET Web Applications模板,ASP.NET MVC 2模板,或者WCF Service Application模板。您可以添加一个或多个Role到您的云计算服务中,然后点击OK,完成创建工程和项目。

clip_image004

创建好服务后,您的工程中会有几个项目。其中之一是Cloud Service项目,它包含了Windows Azure需要的所有的配置信息。有了这些信息,Windows Azure才能运行您的服务,并在项目生成后允许您添加或删除Role。

在Roles目录下右键点击role关联,选择Properties…会弹出配置页面,通过这个页面可以设定Role的属性。

clip_image005

正确运行

使用Visual Studio 2010来开发Windows Azure Cloud Services关键的好处之一是,开发工具能帮助您模拟测试和调试的环境,完全在本地运行您的服务。您甚至不需要使用Windows Azure的账号。这个模拟包括了会在本地模拟运行您的云计算服务的开发网格,, 也包括了会在您的本机上运行Windows Azure存储的开发存储,。有了开发网格和存储,您就可以在离线状态下开发、测试和优化您的云计算服务了。

在运行开发网格的时候,您可以利用Visual Studio强大的调试功能,包括无缝跨跃不同role和role实例的调试体验。下图所示的是一个调试过程,您可以一步步调试一个web role的执行过程。

clip_image006

部署到云

一旦您准备将应用部署到云端,Visual Studio提供了一系列的发布步骤,会将您的云计算服务打包成可部署的Windows Azure格式,随后您可以使用Windows Azure Developer Portal部署您的云端服务。

要了解更多,请访问Cloudy in SeattleCloud Tools这两个博客。

Namaste!

posted on 2009-12-22 12:53:02 by Soma  评论(2) 阅读(1780)

 

[原文发表地址]Creating extensions for VS 2010

[原文发表时间]Wednesday, December 09, 2009 3:42 PM

虽然 Visual Studio 有丰富的内置功能,但任何现代平台的一个关键是功能的可扩展性。

Visual Studio 2010的重点工作之一是不仅对API进行改进,而且对整个扩展开发的生态系统进行提升。目标很简单 — — 我们要使从创建到发布到使用的整个过程都更容易。

开始之前…

您将首先注意到的一件事是简化了的 Visual Studio 2010 SDK。

现在的SDK只有10MB,而在以前它的大小是 100 MB。我们通过将文档示例发布到网上的形式达到了精简的效果,而且这也使我们能够不断及时提供更新内容。现在SDK的安装时间从以前的二十分钟降低到只需一分多钟。

构建

为Visual Studio 2010构建扩展从没有这么容易过。

SDK提供了一组项目模板,可帮助您构建从编辑器视觉效果到菜单命令和工具窗口等各种不同的扩展。

WPF现在是我们扩展模板中的一等公民。现在你立刻就可以启动并运行一个WPF工具窗口。 同样,使用XAML来设计并将一个自定义的用户界面添加到Visual Studio编辑器也很容易。扩展编辑器明显变得更简单、 更可靠。以前,尝试做一些简单操作如获取一个符号的位置,也要花费几行难看的互操作代码。使用新的编辑器API你只需一行代码,而无须任何互操作。

扩展的可能性是无止境的。您想将团队的社交网络工具集成到编辑器中,以便直接在Visual Studio中共享代码吗?构建一个扩展吧。想要将架构图或TFS历史记录也嵌入代码编辑器吗?您可以做到。不喜欢关键字着色的默认样式吗?几行代码就可以改变它。使用扩展,您可以将Visual Studio定制成您喜欢的强大的编程工具。

分享

部署您的扩展插件不再是“火箭科学”(译者注:指复杂的事)。您无须构建MSI来分享您的扩展。所有的扩展项目模板都会生成VSIX文件。VSIX是我们新的部署单元,它利用开放包装公约(Open Packaging Convention)zip格式并利用的xcopy部署功能来部署您的扩展库。

使用新扩展管理器(Extension Manager),用户可以直接在IDE中找到并下载扩展。这种体验要感谢新增的及改进的Visual Studio 库(Visual Studio Gallery),它使您只需上传您的VSIX文件就能与世界共享您的创作。

现在轮到您了

Visual Studio团队博客提供了一个综合的建立您自己的扩展的演练。我建议您访问该博客,然后开始构建您自己的Visual Studio扩展。一旦您构建了一个扩展,您可以上传到Visual Studio 库来与其他人分享。 您可以为您的扩展选择免费共享或收取一定费用,然后使用丰富的HTML来自定义您的扩展页。当您的页面发布以后,您的扩展就能在Visual Studio中的工具菜单下的扩展管理器中找到了。

请参阅 VS 扩展性开发中心扩展示例SDK 文档以了解有关构建扩展的更多信息。我期待在 Visual Studio 库中看到您的扩展。

Namaste!

posted on 2009-12-22 12:51:26 by soma  评论(0) 阅读(1676)

 
2009年12月21日

[原文地址]:Visual Studio 2010 and .NET Framework 4 Beta period extended
[原文发表时间]:Thursday, December 17, 2009 4:14 PM

在今年10月,我们发布了Visual Studio 2010和 .NET Framework 4的Beta2版。此后,我们陆续收到了很多有益的反馈。感谢你们提供的颇具建设性的意见和建议。

我们听到了许多对于Visual Studio 2010和 .NET Framework 4里新特性的肯定。对于这一版本带来的全面的价值提升,很多人也表示满意。

与此同时,我们也收到了很多有关性能方面的反馈,特别是针对一些关键场景下的虚拟内存使用情况。正如你看到的,从Beta1到Beta2,Visual Studio 2010和 .NET Framework 4的性能已经有了大幅提高。接下来,我们会在这方面做更多的工作。在Beta2发布后的几个月里,我们的开发团队埋头苦干,致力于进一步提高产品性能。而且,我们已经看到了一些可喜的成果。

为了验证我们在产品性能方面所做改进的针对性和有效性,同时确保产品的高质量,我们计划适当延长Beta测试阶段。具体来说,我们将在明年二月公开发布一个附带“go live”授权的中间版本,也就是RC版(Release Candidate)。

我们预计将会收到不少基于该RC版的反馈。为了能有足够的时间来处理这些反馈,我们打算把Visual Studio 2010和 .NET Framework 4的最终发布时间往后顺延几个星期。

我邀请您继续把您对产品的反馈意见发送给我们。您的意见和建议将极大地帮助我们提高产品质量。

Namaste!

posted on 2009-12-21 20:34:23 by Soma  评论(0) 阅读(3850)

 
2009年12月18日

[原文地址]:Building setup and deployment packages in VS 2010
[原文发表时间]:Monday, December 14, 2009 9:14 PM

编写和优化代码是构建应用程序的重要工作之一。一个应用程序一旦构建完成,你需要对其进行部署。然后,你的客户才可以开始使用该应用程序并从中受益。对于很多应用程序而言,最可靠的部署方式是创建一个安装项目,对你的应用程序的部件进行集中打包,组合成一个易于安装的软件包。该软件包一般来说拥有熟悉的界面,方便你的客户使用。

今天,你已可以借助Visual Studio的安装程序项目模板来创建一个安装项目。然而,从我们的客户那里我们了解到,他们需要更多软件安装/部署方面的特性和功能。例如,借助Team Foundation Server构建一个更简单、更现代的开发者体验。最重要的是,提供一条路,可以引领我们的客户获得更先进的部署能力,以适应他们应用程序日益扩大的规模。

为了响应这样的需求,我们和InstallShield的开发公司Flexera合作,专为Visual Studio 2010的客户开发了InstallShield Limited Edition 2010。这个版本是Visual Studio的一个扩展。现在,你就可以下载并使用它来创建基于Windows Installer的软件安装包,并在Windows平台上部署你的应用程序。除了提供Visual Studio安装程序项目的类似功能以外,InstallShield Limited Edition 2010还有易于使用的,现代化的图形开发界面并可以让你使用Team Foundation Server来构建你的软件部署项目。当你的应用程序的规模扩大超过InstallShield Limited Edition 2010的限制,你还可以把基于InstallShield Limited Edition 2010的软件安装项目导入到更高级版本的InstallShield。这将有助于保护你的既有投资。

如何获得它?

要下载使用InstallShield Limited Edition,你可以在Visual Studio 2010里,点击File | New | Project…菜单,在左侧的树形浏览区域里,找到Other Project Types | Setup and Deployment节点,然后选择InstallShield 2010。它包含一个名为“Enable InstallShield Limited Edition”的项目模板。

image

在项目被创建之后,该模板将带领你到InstallShield注册页面。注册成功后,你就可以进入我们合作伙伴的下载页面,下载并使用InstallShield Limited Edition 2010。

image

如何使用它?

安装完该产品后,通过New Project对话框里的一个选项,你可以创建一个基于InstallShield Limited Edition的项目。通过File | New | Project…菜单,打开New Project对话框并在Other Project Types | Setup and Deployment | InstallShield 2010节点下选择“InstallShield Limited Edition Project” 模板。

image

Visual Studio 2010 with InstallShield Limited Edition 2010向我们客户提供了另外一个选择,帮助他们构建更简便的软件部署解决方案。它使部署工作成为自动化构建的一部分,并且提供了一条升级路径,允许你在应用程序日益增长的情况下,迁移到更大更好的软件安装部署解决方案上去。

Namaste!

posted on 2009-12-18 15:08:36 by Soma  评论(1) 阅读(1980)

 
2009年11月13日

[原文发表地址]:Teamprise: Enabling TFS collaboration across heterogeneous platforms
[原文发表时间]:Monday, November 09, 2009 5:05 AM

开发团队往往使用许多不同的平台和开发环境。不同环境之间的互操作性是合作中的一项重大挑战。

Teamprise的客户端套件解决了互操作性的问题。它使得基于多种操作系统,包括Windows、Unix、Linux、和Mac OS X,使用Eclipse和基于Eclipse IDE的开发人员也能使用微软的Visual Studio Team Foundation Server来构建应用程序。

我很高兴地宣布:微软已收购Teamprise技术。

微软将致力于这项技术的未来发展,Teamprise工具将被整合到Visual Studio 2010中,作为Visual Studio 2010的一部分进行发布。

收购Teamprise技术是我们继续致力于互操作性、无论客户目前使用何种开发环境都致力于帮助客户实现更大的商业价值的重要一步。

您在Microsoft PressPass网站可以找到更多此次收购的详情。

Namaste!

posted on 2009-11-13 10:59:01 by Soma  评论(2) 阅读(3060)

 
2009年11月11日

[原文发表地址]:Developing for the web using VS 2010 and .NET 4
[原文发表时间]:Tuesday, November 03, 2009 10:50 PM

Visual Studio 2010和.NET 4包含了许多帮助提高开发人员工作效率的新功能和增强功能。这些或大或小的改进共同使工作效率得以巨大的提升。

Web应用拥有易于获取和无摩擦等特性,因此越来越多的开发人员开始转向web来开发和发布他们的应用程序。 Visual Studio 2010 和 ASP.NET 4提供了一些新功能来帮助您。在这里我将对其进行着重介绍。

HTMLASP.NETJavaScript snippets (代码段)

C# 和 VB 用户使用snippets来提高开发效率已有很多年了。 现在 web 开发人员在HTML, ASP.NET标记和JavaScript上可以得到同样的支持。数百个新的snippets能够帮助您自动完成常用ASP.NET和HTML标记,包括必要属性(如runat="server")和标记的公共属性(如ID,DataSourceID,ControlToValidate和文本)。

JavaScript 动态IntelliSense支持

开发人员使用JavaScript之类动态语言开发时面临的最大挑战之一是类型是动态添加和更改的。这几乎使得IntelliSense不能使用。在Visual Studio 2010中JavaScript IntelliSense引擎针对动态类型进行了重新设计。例如您能够得到registerNamespace生成类型的IntelliSense信息。该引擎还增加了对常见JavaScript库的支持。下面是一个IntelliSense对于新注册类型与新函数支持的例子。

JavaScript IntelliSense

简化的 Web 部署

Web 部署总是令web 开发人员非常头疼的问题。应用程序逻辑、数据库、IIS设置、数据和配置转换所有这些都可能需要在部署之前安排好。

现在,MSDeploy,一个新的部署工具,能够把与一个web应用程序关联的所有设置、文件和数据打包,然后部署到远程站点或存档以便将来检索。现在IIS7管理控制台包含了一个用于导入由 MSDeploy 创建的程序包的向导。

Visual Studio 2010将MSDeploy无缝整合到web开发工作流程中,同时添加了许多用户需要的功能。这些功能包括通过web.config转换来修改常见设置(如web服务的end point和连接字符串),以及从开发人员的计算机转移到暂存或产品服务器之前的数据库部署的自动化。下面是新的简化的发布对话框:

image

新的应用程序模板

对于新的 web 开发人员来说web开发的入门是令人生畏的。Visual Studio 2010包含了一些针对ASP.NET 4初学者的web应用程序模板。这些模板包括了入门所需要的一切东西:一个确保页面一致性的主版/内容模式,帮助构建JavaScript-rich应用的菜单、登录和CSS 样式表和jQuery。 这些模板提供了一个可以工作的起步web应用,您可以马上开始添加自己的功能。

CSS 改进

现在ASP.NET控件提供了一个ClientIDMode属性使您能够控制ASP.NET生成ClientID的方式。在使用CSS设计样式或编写JavaScript访问HTML DOM时了解该ClientID是特别重要的。

Visual Studio 2010 HTML设计器增强了对CSS 2.1的支持,它提供了一个更准确,更接近浏览器运行时的设计时呈现。

更大屏幕实际使用面积

开发环境的最大卖点之一是屏幕的使用面积。Visual Studio 2010提供了很多选项来帮助开发人员自定义并优化其屏幕使用面积和开发体验。代码优化的web开发配置会优化这些设置来尽可能地扩大屏幕实用面积并把最常用的源码开发命令放在您的手边。您可以在第一次启动Visual Studio时选择代码优化的web开发配置,也可以使用工具|导入导出设置菜单项更改配置。

image

干净的Web.Config

有时,简单就是美。在ASP.NET首次引入时web.config文件甚至不是必须的。即使需要时, 通常也只包含几个条目。后来随着ASP.NET功能的增强, web.config的大小和复杂度都相应增加,致使文件变得难以阅读和维护。现在ASP.NET 4又一次带来了最小的配置文件。

URL 路由与 ASP.NET WebForms

URL 路由是MVC 项目的一种常用于功能。ASP.NET 4支持webforms的URL路由。现在,您可以定义对应用程序有意义,易于用户理解的URL了。这些简化的URL也能得到搜索引擎优化 (SEO)。

了解更多信息

这些仅仅是Visual Studio 2010 web 开发改进的一部分。您可以在此处看到web开发的新功能的完整列表。

还有...

如果您已经开始使用Visual Studio 2010 Beta 2,我们希望听到您的意见。请参与这个调查来告诉我们您的体验。

image

Namaste!

posted on 2009-11-11 14:12:21 by soma  评论(0) 阅读(2636)

 

[原文发表地址] Spec Explorer: A Model-Based Testing tool

[原文发表时间] Monday, October 26, 2009 9:15 PM

一个完整的、一致的并可扩展的测试系统仍然是如何构建和维护软件系统的一大挑战。

今天在DevLabs上发布的 Spec Explorer 工具通过使用基于模型的测试技术来应对这一问题。

clip_image001

它是什么?

Spec Explorer 是一个用来为软件行为建模,并根据这些模型产生测试套件的工具。

模型可以图形表达方式查看,帮助理解分析软件系统预期行为,或与其他人沟通。模型的大小可以通过正则表达式来界定,而产生的测试套件不仅能够在单独的Visual Studio测试框架中运行,也能够在其他单元测试框架中运行。

为何使用它?

微软的多个不同规模的项目都已将Spec Explorer 纳入为开发流程的一部分。使用Spec Explorer 帮助这些团队更快速创建测试用例、确保需求覆盖的可预见性并提供项目生命周期管理及软件更新的支持。

Spec Explorer 的独有功能使得它比其他基于模型的测试工具更易上手。不具备模型开发背景的工程师也能创建系统和功能的模型,并在很短时间内从模型生成测试用例。研究表明,在一个有超过300个测试套件的大型项目中,与手动创建测试套件相比,此功能提升了42%的平均生产率。

在根据微软内部团队的反馈意见来完善Spec Explorer 的同时,我们也需要聆听你们的反馈意见,以确保Spec Explorer 能满足用户在不同类型及规模的项目中使用的需求。

现在就下载Spec Explorer 吧,您可以在这个论坛提问或提交反馈意见,也可以通过团队博客来了解最新信息。

Namaste!

posted on 2009-11-11 11:38:09 by soma  评论(0) 阅读(2582)

 
2009年11月10日

[原文发表地址]:Announcing Visual Studio 2010 and .NET FX 4 Beta 2
[原文发表时间]:Monday, October 19, 2009 9:10 AM

clip_image001

请允许我在此非常高兴地宣布Visual Studio 2010和.NET Framework 4 Beta 2的发布。MSDN的订阅用户可以在今天下载Beta 2。周三的时候Beta 2的下载会向全世界发布。

在Beta 1的基础上,Visual Studio 2010无论是在性能方面还是整体稳定性方面,都有了显著的改进。虽然距离我们正式发布Visual Studio 2010还有很多工作要做,但希望您喜欢当前的试用版。

Beta 2集成了对SharePoint的工具支持,包括项目模板和调试器支持。对于开发Windows 7应用程序也有相应的运行时(runtime)和工具支持。

相对Beta 1而言,我们添加了Windows Azure Tools模板,帮助您开始开发Windows Azure应用;增强了对Silverlight 3数据绑定的支持,使得您可以集中精力关注自己的业务代码,而不是那些重复的数据绑定代码。

Team Foundation Server现在被包括在所有含MSDN的Visual Studio 2010版本中。对于规模较小的团队,如果仅仅需要它的核心功能(例如源代码管理、bug追踪、build自动化等等),可以使用TFS Basic。TFS Basic的安装相对简单,并且可以在服务器或者客户端计算机上运行。测试元素(Test Elements)的用户将会注意到一个更加直观,反应更加迅速的用户界面。

在这个版本里,.NET Framework也有所增强。令人鼓舞的是,相对之前的.NET Framework,尽管.NET Framework 4 Beta 2的功能有所增加,但其下载包的尺寸显著变小了。我们大大改善了WPF的文本生成堆栈,使得Visual Studio 2010编辑器里的文本字体看上去更加锐利。

我们也在今天宣布简化的产品线和定价策略,以及面向 MSDN 订阅者的新优惠措施。MSDN Premium 的订阅用户可以参与“Ultimate Offer”,即可以在2010年3月22日,也就是Visual Studio 2010发布的那一天升级到高一级版本的Visual Studio。请到这里了解关于新的产品线和“Ultimate Offer”的更多信息。

今天,Visual Studio 2010 Beta 2面向MSDN订阅用户发布,10月21日则对公众发布。请关注Visual Studio 2010产品页面或者注册以获得Visual Studio发布的通知。我本人和我们的团队期待着听到您的反馈。

Namaste!

posted on 2009-11-10 15:39:20 by Soma  评论(0) 阅读(2847)

 
2009年10月26日

[原文地址] F# in VS2010

[发表时间] Friday, October 09, 2009 10:21 PM

通过Visual Studio,我们努力给你的公司提供工具来解决范围广泛的软件问题,并通过基于.NET框架向您提供所需要并期盼的互通性和效率。

作为其中的一部分,Visual Studio 2010从第一个发布开始就支持函数式程序设计的F#编程语言。

F#结合了函数式程序设计和面向对象编程,是一种高效的.NET编程语言。而且F#还是进行平行计算、算法研究以及技术开发和拓展的理想工具。F#是微软研究院和Visual Studio开发团队密切合作的成果。自从宣布了Visual Studio 2010中包含F#,我们已经看到了很多人对此的兴趣并开始使用。我们同时还与F#社区和主要的使用者密切合作来保证F#满足职业软件开发人员在这些领域的需求。

F#Visual Studio 2010中加入了许多的新功能,包含了从元组和函数的“小型编程”到简单无错的异步编程,以及强类型的浮点编程。以下是这个Visual Studio语言编程家族新成员的一些亮点。

简单、简洁的语法

F#是一种强类型语言,就和C#一样,但是它具有像动态语言一样的轻量级语法。以下的这段代码可以让你感受到F#编程的轻量级,就像数学计算一样。

let data = (1,2,3)

 

let rotations (x, y, z) =

    [ (x, y, z);

      (z, x, y);

      (y, z, x) ]

 

let derivative f x =

    let p1 = f (x - 0.05)

    let p2 = f (x + 0.05)

    (p2 - p1) / 0.1

 

let f x = 2.0*x*x - 6.0*x + 3.0

 

let df = derivative f

 

System.Console.WriteLine("The derivative of f at x=4 is {0}", df 4.0)

运行的时候,这段程序会打印出:“The derivative of f at x=4 is 10”。

平行和异步编程

.NET Framework 4Visual Studio 2010包含了强大的类库和工具,能够简化平行应用的开发。F#语言的功能补充了这点,让平行异步编程更贴近人类的思考方式。这其中包含了基本的语言功能,比如不可变的第一类函数,以及强大的编程模型。又比如可以让你在同一个线性样式中编写异步代码的异步工作流,就像编写你所习惯的同步代码一样。

let http url =

    async { let req =  WebRequest.Create(Uri url)

            let! resp = req.AsyncGetResponse()

            let stream = resp.GetResponseStream()

            let reader = new StreamReader(stream)

            let! contents = reader.AsyncReadToEnd()

            return contents }

 

let sites = ["http://bing.com"; "http://microsoft.com";

             "http://msdn.com"; "http://msnbc.com"]

 

let htmlOfSites =

    Async.Parallel [for site in sites -> http(site)]

    |> Async.RunSynchronously

Visual Studio 2010.NET 4集成

集成在Visual Studio 2010里的F#包含了项目模板,IDE支持,智能感应,以及和F#交互式工具窗口的集成。F#能够用来开发基于.NET 2.0.NET 4以及Silverlight的应用程序和组件。作为.NET语言的一员,F#可以和C#Visual Basic.NET一起很好的协作。此外,在.NET 4中,F#用的核心类型(比如元组,Lazy类型,BitInteger等)现在成为了.NET框架的一部分,并能用于所有的.NET语言。

F#交互式工具窗口在Visual Studio中提供了探索性开发的方式。下面你会看到在Visual Studio编辑器中打开的F#脚本的源代码,以及交互执行代码的F#交互式工具窗口。右上方是脚本所创建的Form和图形。

image

 

测量单位

F#中的一个创新的功能是测量单位。它可以让你用米或秒等单位来注解你的浮点代码。这做起来很简单,当在开发过程中,代码绑定到了一个错误的单位将会报告错误。这提供了编译时检查浮点代码的正确性,而不会牺牲性能。

clip_image002

这只是F#中令人激动的所有功能的惊鸿一瞥。预知更多详情,请访问MSDN上的F#开发中心

Namaste!

posted on 2009-10-26 21:20:10 by Soma  评论(0) 阅读(4008)

 
2009年10月22日

[原文地址] Come meet the new MSDN
[原文发表时间] Monday, October 19, 2009 12:11 PM

clip_image001

全新设计的MSDN全球网站重新上线,为所有的MSDN订户提供新的价值!

MSDN订阅为开发人员、团队和组织提供了对Microsoft工具和技术的全面了解和获取的途径,使他们有信心完成各种设计,开发和测试软件解决方案工作。除了提供数以千计的下载外,它还提供专业的支持服务及专家信息资源,以确保开发人员可以迎接最大的挑战的考验。

今天,我们介绍的新功能,将为开发人员提供更好的支持,并帮助他们的事业。所有MSDN和BizSpark的用户将能够使用免费的电子学习课程(英文)。我们通过MSDN论坛为所有用户提供优先支持。与此同时,我们还为MSDN Premium和BizSpark用户推出了免费的Windows Azure云计算平台,以及接下来的Windows Azure商业应用。为了推动这个强大的平台的发展,用户将在前8个月内,每月获得750个免费“计算小时”。

MSDN网站为我们遍及世界各地的客户提供了全新的设计,包括37个国际网站。新设计的目标是改善网站和中心的总体体验,以协助您更好的使用Microsoft产品和技术来获得成功。新的MSDN网站提供了新的视觉设计,为社区提供的对内容的新的互动方式,以及宣传社区动态内容的新的Silverlight控件。这里包括了一个“社区活动”区域来显示最近和最流行的论坛主题、示例代码和技术文章。MSDN库现在还提供两种新的库视图:ScriptFree(通过减少脚本和服务器的往返次数来设置性能标准)和Lightweight Beta(类似VS 2010的脱机帮助体验)。

这仅仅是围绕我们在线产品的,提高其可发现性、可读性、一致性和相关性的一项重要投资的开端。

我们致力于将MSDN打造为用户从最初想法到最后解决方案寻求帮助的最佳去处。MSDN用户的反馈对我们而言是至关重要的。感谢每一位提供了反馈意见和建议的用户,正是您的意见和建议使得MSDN日益完善。我们在MSDN网站反馈论坛期待着听取您更多关于如何使MSDN更好的为您服务的意见。

Namaste!

posted on 2009-10-22 10:47:40 by soma  评论(0) 阅读(2627)

 
2009年10月20日

[原文地址] Making your application sparkle with Windows 7
[原文发表时间] Friday, October 02, 2009 8:16 PM

Windows 7的发布已经日益临近了。作为开发人员,无论选择托管代码还是非托管开发应用程序,您都可以利用Windows 7上新的API和类库,来使您的应用程序大放异彩。

多点触摸(Multi-Touch

触摸界面允许用户通过更加直观的方式与应用程序进行交互。Windows 7利用Windows Touch,引入了多点触摸输入和操作处理。

MFC支持C++程序员开发触摸界面应用程序。MFC会处理大多数的繁重工作:监听Windows触摸相关的消息,调用一系列的虚函数来处理这些消息。开发人员仅需要注册触摸输入,设置手势动作的配置文件,并根据自己应用程序的需求,重写这些虚函数。

WPF 4为触摸界面增添了一个对象模型(object model),使用托管代码的开发人员可以很容易地给自己的应用程序添加触摸支持。在已有事件的基础上,一些新的支持多指输入的事件也被添加进来。同时会有新的操作和惯性事件供开发人员使用。

Ribbon控件

如果您需要组织应用程序中的命令、任务和菜单,如果您希望将它们友好地展示给用户,请考虑使用Ribbon控件。通过Ribbon控件,您的用户会更容易找到他们需要的命令。无论您的应用程序是用什么完成的:Win32,MFC,还是WPF,新的控件和API都能供帮助您在应用程序中添加Ribbon控件。

对于Win32应用程序,Ribbon架构提供一系列API来创建Ribbon控件。您可以在这里找到Win32中关于Windows Ribbon Framework的更多信息。

Visual Studio 2008 SP1为MFC应用程序添加了Ribbon UI使您获得Office风格的界面。在Visual Studio 2010里则为Windows Ribbon提供了更多风格的支持。新的MFC Ribbon设计器,将Ribbon的设计用XML格式来保存,这样大大简化了UI开发,再不需要用代码来做设计了(design in code)。创建和编辑Ribbon变得非常简单。

clip_image001

新的WPF Ribbon控件将不会随着Visual Studio发布,而是会通过Office UI Licensing网站发布。WPF Ribbon控件的发布时间大约与WPF 4的时间相符。您可以在这里找到下载WPF Ribbon的说明(当前是预览版)。WPF Ribbon将包括所有标准Ribbon控件的功能,如tab、分组、动态缩放、快速访问工具栏、应用菜单、contextual tabs、key tips等等。另外还会提供Windows 7和Office专用的皮肤。Ribbon本身会继续作为独立的,分离的程序集供大家使用。

定位(Location

Windows 7的另一个特性是定位平台。利用这个平台,您可以构建一个根据用户当前位置,而进行相应操作的应用程序。定位平台使得您可以开发更多有趣的应用,特别是对于移动设备用户。比如,一个能感知位置的应用程序可以利用当前的位置信息,来显示用户周边的餐厅或商店;一个发送短信或电子邮件的应用程序可以把发送者的位置信息以附件的形式发送出去。

定位系统将定位设备(如GPS和WWAN)与Windows相集成。应用程序利用它提供的API来确定计算机当前的位置。因为定位API通过COM接口来提供其功能支持,C++程序员和脚本语言程序员可以利用这一套API。Windows 7 SDK包括一系列示例和文档,帮助你创建能进行位置识别的应用程序。MSDN上有更多关于这一套COM定位API的信息。

除了这套API,.NET Framework 4也将会包含一套用于定位的托管代码API,.NET应用程序也可以轻松利用Windows 7的定位能力。

Shell集成

Windows 7的Shell增强功能使得应用程序的开发者能够为终端用户提供更丰富的集成用户体验。跳转列表(Jump List)是一个提供上下文相关的启动事件的列表,用户可以通过它快速访问相关的任务或文件。举例说明,右键点击Outlook图标将显示一个跳转列表,列出您最近打开过的邮件:

clip_image002

新的任务栏没有以前那么拥挤了,而且可以提供更多的预览信息。您可以把任意的程序固定到任务栏上,也可以通过点击和拖拽重新安排任务栏上的图标。Aero缩略图,也就是当你鼠标悬停在任务栏上一个图标时出现的预览窗口,将支持自定义视图和用户命令。如下所示的是一个支持控制媒体播放器回放的命令的Aero缩略图:

clip_image003

针对这些Windows 7 Shell功能,MFC添加了相应的支持。默认情况下,由MFC应用程序通过“打开文件”对话框打开的文件,都会自动添加到您的“最近文件”跳转列表里。MFC提供API来自定义跳转列表里的内容,所以您可以重写这一默认行为。MFC也添加了对高打印分辨率(DPI)和许多Windows对话框新功能的支持。下图展示的打开文件对话框,经过自定义后,添加了一些控件:

clip_image004

MFC当然也支持搜索、预览、缩略图。您可以在资源管理器的搜索框里搜索MFC文档,然后像Office应用程序一样查看图标和预览。

clip_image005

如果您的应用的安装程序需要访问或更新某个文件,而这个文件有可能被锁定或者被另一进程使用,这时候您可以利用重启管理器(Restart Manager)来关闭和重启应用程序,或者利用重启管理器来消除或减少在安装过程中系统需要重启的次数。仅需短短几行代码,您就可以充分利用重启管理器的功能,自动备份当前打开的文档。MFC也在ATL中添加了对事务的文件系统的支持。

这些新的 MFC 功能,都集成在Visual Studio 2010里。若要利用某些功能(例如跳转列表),您只需要重新编译您的应用程序就可以了;而对其他一些功能(如 Windows触摸支持或重启管理器支持),您需要添加几行新的代码以引入新的功能。

WPF 4也允许您在WPF应用程序中利用Windows 7的Shell新功能。WPF 4 集成了 Windows 7 跳转列表的功能,包括任务、项目、最近文件列表和频繁使用的文件列表、以及自定义类别。WPF 4同样集成了Windows 7的任务栏特性,包括进度条、重叠图标、支持命令的预览按钮、描述性文本,和桌面窗口管理器 (DWM)的预览图剪辑。

更多信息

以上只是给大家粗略浏览一下在Windows 7上您可以构建怎样的应用程序。您可以访问Windows团队博客和MSDN 的 Windows 7 开发指南来获取更多信息。。

Namaste!

posted on 2009-10-20 15:12:51 by Soma  评论(0) 阅读(4467)

 
2009年10月16日

[原文地址]:Walking down memory lane...

[原文发表时间]:Tuesday, September 29, 2009 5:56 PM

有些时候,我们会埋头于当前正在做的事情当中,日常的工作,和即将来临的最后期限等等。有时候,停下来回忆并反思这些在旅程中的“为什么、什么、怎样以及哪里”是挺好的。

最近,我获得了一个这样的机会,受邀参加为Visual Studio纪录片的视频拍摄。我其实不是很确定这次的期待是什么,也不知道最终产品将会怎样,但是基于过去我在Channel 9的经验,我说让我们赌一把。这样做挺有趣的。

拍摄团队最近完成了Visual Studio纪录片的拍摄并且于今天早些时候在Channel 9 上发布了第一第二部视频.

能听到我的一些同事的情况我觉得这特别有趣,其中包括在这个产品线上工作了很久的Anders Heljsberg, Dave Mendlen, Jason Zander 和 Scott Guthrie。希望你也能觉得这有趣。

Namaste!

posted on 2009-10-16 16:18:27 by Soma  评论(0) 阅读(2412)

 
2009年09月29日

[原文地址]:Announcing WebsiteSpark

[原文发表时间]:Thursday, September 24, 2009 6:51 AM

WebsiteSpark[1]

在过去的15年中,网络极大的改变了软件业。今天,我们很难想象不需要网络的业务。几乎所有的企业都已经或正在网上建立自己的站点:推广或销售其产品和服务、寻找新客户、或者为现有的客户提供支持。以此同时,网络已经产生了一个新的、庞大的网络专业人员的生态系统——专注于帮助这些企业蓬勃发展的开发和设计人员。

许多企业,特别是小型企业,面临的挑战是如何开始建立他们的网络项目。这就是为什么我很兴奋地宣布WebsiteSpark项目的上线,这是一个旨在帮助少于10人的小型公司开始网络开发和设计的新项目。最新的"Spark“系统提供了包括 BizSpark 和 DreamSpark在内的产品,WebsiteSpark建立在这些之前的成功方案之上,为各地的网络专业人员提供软件、支持和机会。

虽然微软一直在鼓励小型公司使用我们的技术,但是我们发现目前市场上提供小型网络咨询和托管这一领域的公司和市场需求有差距。大约5个月前,我们对200多个在Linux和Windows平台上工作的网络专业人员进行了一项调查,并发现这种差距是十分明显的:尽管许多公司通过“免费软件”或“免费/社区支持”提供了类似的计划,但是我们发现,这些公司真正想要并需要的是帮助自己的公司招揽生意的能力和网络. 我们有责任帮助在各种不同类型的组织中工作的web开发人员,所以我们将WebsiteSpark加入到我们的方案中来帮助这些公司取得更大的成功。

有了WebsiteSpark,符合条件的公司可以得到设计和开发软件许可证和处理器许可证,无需任何前期成本。此外,他们将得到支持和培训,以及获得一个广阔的市场平台,使他们能够连接世界各地的潜在客户,并通过微软的市场平台销售自己的产品。市场平台的门户网站将在今年秋天晚些时候上线。

简单地说,WebsiteSpark项目使企业能够方便地访问微软Web平台并在上面做开发,为世界各地的网络开发人员和设计师提供了一个健全的网络创新环境。

这就是为什么今天在WebsiteSpark项目发布的同时,我还要宣布Web平台安装程序2.0和Windows Web应用程序库(App Gallery) 2.0的发布。

这次发布的Web平台安装程序版本简化了安装过程,并包括了诸如IIS媒体服务和Windows Azure SDK等新的附件。通过与应用程序库(App Gallery)相结合,开发人员还能获得一大堆免费的、开源且可以直接安装的应用程序,以帮助他们建立自己的网站。现在已经有20多个来自微软和整个社区的新的应用程序了,包括新增加的Moodle和Sugar CRM以及其他一些流行的Web应用程序,如WordPress、Drupal、DotNetNuke等等。

欲了解更多有关该WebsiteSpark 项目的信息,包括使用条件,请访问www.microsoft.com/web/websitespark

您可以从http://www.microsoft.com/web下载到Web平台安装程序2.0和Windows Web应用程序库。

Namaste!

posted on 2009-09-29 16:49:26 by soma  评论(0) 阅读(3180)

 
【第1页/共9页,122条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.2.0