<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_极地银狐.NET</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/14616/rss</id><updated>2012-03-05T14:18:06Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/14616/rss"/><entry><id>http://www.cnblogs.com/dingsea/archive/2012/03/05/2381062.html</id><title type="text">如何编写nopCommerce插件</title><summary type="text">希望此文能让你开始nopCommerce的插件之旅并搞个出类拔萃的插件。</summary><published>2012-03-05T14:18:00Z</published><updated>2012-03-05T14:18:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2012/03/05/2381062.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2012/03/05/2381062.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;em&gt;插件（Plug-in，又叫addin、add-in、addon或add-on）是一种电脑程序，通过和应用程序的互动，用来替应用程序增加一些所需要的特定的功能。(Wikipedia)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;插件用来扩展nopCommerce的功能，nopcommcer有多种类型的插件。比如支付方式中的paypal，税率供应商，配送计算方式 （UPS,USP,Fedex），小部件（live  chat功能）等等。nopCommerce本身也自带了很多不同的插件。你可以在官网上搜索是否已经有人上传了满足你需要的插件。如果没有，哥这就手把 手带你编写一个出来。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;div&gt;文章说明：文章来源自&lt;a target="_blank" href="http://www.cnblogs.com/dingsea/admin/www.dingsea.com"&gt;我的博客&lt;/a&gt;，于原文之理解而翻译，并非出版社那种按字词翻译风格。欢迎各位提出意见，也欢迎各位转载不过务必注明本文原址。更多   nopcommerce的文章请关注&lt;a target="_blank" href="http://www.dingsea.com/?tag=nopcommerce"&gt;http://www.dingsea.com/?tag=nopcommerce&lt;/a&gt;，或者加入我们的QQ群   101675096&lt;/div&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;插件结构，所用文件，所在位置&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1.你第一件事就是要在解决方案中新建一个&amp;#8220;类库&amp;#8221;项目。最好的办法是把插件都放在解决方案根目录（不过小心不要和Nop.Web下边的 plugins目录搞混了，那儿是放已布置插件的），而且最好把插件也都放在解决方案目录的plugin目录中（关于更多解决方案文件夹的信息，请&lt;a href="http://msdn.microsoft.com/en-us/library/sx2027y2.aspx"&gt;猛击此处&lt;/a&gt;）&lt;/p&gt; &lt;p&gt;&lt;img title="nopcommerce plugins" src="http://www.nopcommerce.com/images/documentation/plugin.1.jpg" alt="" height="429" width="240" /&gt;&lt;/p&gt; &lt;p&gt;最好以这种方法来命名：&amp;#8221;Nop.Plugin.{Group}.{Name}&amp;#8221;。{Group}是你插件的分类（比如支付），{Name}是你的 插件名（比如&amp;#8221;AuthorizeNet&amp;#8221;），那么Authorize.NET的支付插件就会有这样的名 字：Nop.Plugin.Payments.AuthorizeNet。&lt;/p&gt; &lt;p&gt;2.一旦建立了插件项目，把输入路径改为&amp;#8221;..\..\Presentation\Nop.Web\Plugins\{Group}.{Name} \&amp;#8221;，比如 Authorize.NET 支付插件就会有这样的输入路径:  &amp;#8220;..\..\Presentation\Nop.Web\Plugins\Payments.AuthorizeNet\&amp;#8221;。搞定以后，对应的插件 DLL就会被拷贝到 \Presentation\Nop.Web\Plugins\ 文件夹，nopCommerce内核会搜索此文件夹。&lt;/p&gt; &lt;p&gt;&lt;img title="plugin.2.jpg" src="http://www.nopcommerce.com/images/documentation/plugin.2.jpg" alt="" height="184" width="561" /&gt;&lt;/p&gt; &lt;p&gt;a.在项目菜单，点击属性&lt;br /&gt; b.选择生成选项卡&lt;br /&gt; c.点击输入路径旁边的浏览按钮选择一个输入目录&lt;/p&gt; &lt;p&gt;你要在debug和release模式下都要做此步骤。&lt;/p&gt; &lt;p&gt;3.下一步你就要为你的每一个插件建立一个Description.txt，此文件包含描述插件的信息。你可以从其它插件目录中拷出来。比如Authorize.NET支付插件的Description.txt就有如下内容：&lt;/p&gt; Group: Payment methods FriendlyName: Credit Card SystemName: Payments.AuthorizeNet Version: 1.00 SupportedVersions: 2.30 Author: nopCommerce team DisplayOrder: 1 FileName: Nop.Plugin.Payments.AuthorizeNet.dll  其实所有的信息你都能看懂，不过有一些注意事项。&lt;strong&gt;SystemName&lt;/strong&gt;必须唯一。Version字段是你插件的版本号，你可以将它设置为你喜欢的任何值。&lt;strong&gt;SupportedVersions&lt;/strong&gt;可以包含一个由逗号分隔的（确保nopCommerce当前版本包含在此列表中，否则此插件没戏）支持版本清单。&lt;strong&gt;FileName&lt;/strong&gt;是用这个格式：Nop.Plugin.{Group}.{Name}.dll（是你插件的assembly文件名）。要确保此文件的&amp;#8220;拷贝到输入目录&amp;#8221;属性是&amp;#8220;Copy if newer&amp;#8221; &lt;p&gt;&lt;img title="plugin.3.jpg" src="http://www.nopcommerce.com/images/documentation/plugin.3.jpg" alt="" height="190" width="211" /&gt;&lt;br /&gt; 4.所需的最后一个步骤是创建一个类实现IPlugin接口（Nop.Core.Plugins命名空间）。nopCommerce有 BasePlugin类已经实现了一些IPlugin方法，这样你就不用苦逼地再写一遍。nopCommerce还提供一些从IPlugin派生特定的接 口。例如，俺们有&amp;#8220;IPaymentMethod&amp;#8221;接口，用于创建新的付款插件，它包含了一些特定的用于付款的方法如ProcessPayment（）或 GetAdditionalHandlingFee（）。nopCommerce目前有以下特定的插件接口：&lt;br /&gt; IExternalAuthenticationMethod. 用来建立外部认证方法如 Facebook, Twitter, OpenID, etc.&lt;br /&gt; IWidgetPlugin. 让你可以创建小部件，小部件在你网站的某些地方出现，如左边的Live chat框&lt;br /&gt; IExchangeRateProvider. 用于获得货币汇率.&lt;br /&gt; IDiscountRequirementRule. 允许你创建新的折扣规则比如&amp;#8221;帐单寄到的国家必须是&amp;#8230;&amp;#8230;&amp;#8220;&lt;br /&gt; ISMSProvider. 短信提供商，让你可以在下单时收到短信通知。&lt;br /&gt; IPaymentMethod. 用于处理支付流程的插件。&lt;br /&gt; IPromotionFeed. 这些插件用于向Froogle或PriceGrabber提供产品信息&lt;br /&gt; IShippingRateComputationMethod..这些插件是用于获取可用的配送方法和正确的运费。例如，UPS，UPS，FEDEX等。&lt;br /&gt; ITaxProvider. 税率提供商用于获取税率。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;处理请求。控制器，模型和视图。&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;现在你可以在Admin area &amp;gt; Configuration &amp;gt;  Plugins看到我们的插件了，不过正如你所想，这个杯具的插件啥都不能做，甚至连个配置的界面都没有。现在让我们来创建一个配置页面。我们现在需要做 的是创建一个控制器，模型和视图。&lt;/p&gt; &lt;ol&gt;&lt;li&gt;MVC控制器负责响应对一个ASP.NET MVC网站的请求。每个浏览器请求被映射到一个特定的控制器。&lt;/li&gt;&lt;li&gt;一个视图包含被发送到浏览器的HTML标记和内容。视图是相当于一个ASP.NET MVC应用程序的页面。&lt;/li&gt;&lt;li&gt;一个MVC模型包含视图或控制器以外的所有应用程序逻辑。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;关于MVC模式在&lt;a title="MVC" href="http://www.asp.net/mvc/tutorials/understanding-models-views-and-controllers-cs"&gt;这里&lt;/a&gt;你可以找到更多的信息。&lt;/p&gt; &lt;p&gt;那么，我们可以开工了：&lt;/p&gt; &lt;p&gt;创建模型。新插件中加入一个Models文件夹，然后按你需要新加入一个模型类。&lt;br /&gt; 创建视图。在插件项目中新加一个Views文件夹，再在里边添加一个{Name}文件夹，此处{Name}是指你的插件名。然后再添加一个Configure.cshtml文件。很重要的一点：此视图应该要注明是嵌入资源。&lt;br /&gt; 创建控制器。在插件项目中新加一个controller文件夹，再新加一个控制器类。最好的命名办法是像{Group} {Name}Controller.cs这样如PaymentAuthorizeNetController。再好好地命名一个action方法用于配 置。哥叫它&amp;#8220;Configure&amp;#8221;。准备一个模型类并将其传给这个视图：Nop.Plugin.{Group}.{Name}.Views.  {Group}{Name}.Configure，即那个嵌入视图。比如你在Authorize.NET支付插件中的 PaymentAuthorizeNetController实现你就会比较清楚。&lt;/p&gt; &lt;p&gt;提示一：从其它插件项目中拷贝web.config到你项目里来，这样在做视图的时候有智能感知（老丁：啊？真的么？这和拷文件有什么关系？）。智能感知即微软的自动完成亮点。&lt;/p&gt; &lt;p&gt;提示二：搞定以上步骤最简单的办法是直接把其它插件项目拷贝过来，然后文件和文件夹改名。&lt;/p&gt; &lt;p&gt;提示三：如果你想限制后台（店主）控制器的一些action方法，只用在方法上加[AdminAuthorize]属性即可。&lt;/p&gt; &lt;p&gt;提示四：接下来要确保所有第三方的程序集引用的&amp;#8220;拷贝到本地&amp;#8221;属性设为false，这样可以减小部署包的大小。&lt;/p&gt; &lt;p&gt;比如Authorize.NET插件的项目结构会如下图：&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.nopcommerce.com/images/documentation/plugin.4.jpg" alt="" height="495" width="297" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;路由&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;现在我们要为插件注册相应的路由。ASP.NET路由用于把浏览器发送的请求映射成MVC控制器相应的action方法，接下来的步骤你会读到很多详细关于路由的信息。&lt;/p&gt; &lt;p&gt;1.  新建如下文件：RouteProvider.cs，它会向nopcommerce告知关于插件路由信息。比如下边的RouteProvider添加了一个 新的路由，可以通过浏览器路径http://www.yourStore.com/Plugins/PaymentAuthorizeNet /Configure来访问：&lt;/p&gt; public partial class RouteProvider : IRouteProvider {         public void RegisterRoutes(RouteCollection routes)         {             routes.MapRoute("Plugin.Payments.AuthorizeNet.Configure",                  "Plugins/PaymentAuthorizeNet/Configure",                  new { controller = "PaymentAuthorizeNet", action = "Configure" },                  new[] { "Nop.Plugin.Payments.AuthorizeNet.Controllers" }             );         }         public int Priority         {             get             {                 return 0;             }         } } &lt;p&gt;2.  一些特写的插件接口（像上边讲的）和&amp;#8220;IMiscPlugin&amp;#8221;接口有一个方法&amp;#8220;GetConfigurationRoute&amp;#8221;。它应该向控制器返回一个 用于插件后台配置的路由。实现你插件的&amp;#8220;GetConfigurationRoute&amp;#8221;方法，可以告知nopCommerce你插件的后台配置路由是什 么。如果你插件不需要后台配置，那么此方法将返回NULL，比如下边这样：&lt;/p&gt; &lt;p&gt;public void GetConfigurationRoute(out string actionName,&lt;br /&gt; out string controllerName,&lt;br /&gt; out RouteValueDictionary routeValues)&lt;br /&gt; {&lt;br /&gt; actionName = &amp;#8220;Configure&amp;#8221;;&lt;br /&gt; controllerName = &amp;#8220;PaymentAuthorizeNet&amp;#8221;;&lt;br /&gt; routeValues = new RouteValueDictionary()&lt;br /&gt; {&lt;br /&gt; { &amp;#8220;Namespaces&amp;#8221;, &amp;#8220;Nop.Plugin.Payments.AuthorizeNet.Controllers&amp;#8221; },&lt;br /&gt; { &amp;#8220;area&amp;#8221;, null }&lt;br /&gt; };&lt;br /&gt; }&lt;/p&gt; &lt;p&gt;只要你有这个配置方法，插件安装以后你就能在Admin &amp;gt; Configuration &amp;gt; Plugins找到一个配置链接。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;处理&amp;#8220;安装&amp;#8221;和&amp;#8220;卸载&amp;#8221;方法&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这是可选步骤。一些插件需要有一定的安装逻辑，比如插件要添加一些本地资源数据。在你的IPlugin实现中（大多数情况下是直接从BasePlugin类继承下来），重载以下方法：&lt;/p&gt; &lt;p&gt;1. Install:在插件安装时会调用此方法，你可以在此初始化任何设置，添加新的本地资源数据或添加新的数据库表（如果需要的话）&lt;/p&gt; &lt;p&gt;2.Uninstall:在卸载插件时会调用此方法。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;重要说明&lt;/strong&gt;：如果你重载这些方法，不要隐藏基类的实现。比如重载&amp;#8221;Install&amp;#8221;的时候要记得调用base.Install(),Authorize.NET的install方法如下：&lt;/p&gt; &lt;p&gt;public override void Install()&lt;br /&gt; {&lt;br /&gt; var settings = new AuthorizeNetPaymentSettings()&lt;br /&gt; {&lt;br /&gt; UseSandbox = true,&lt;br /&gt; TransactMode = TransactMode.Authorize,&lt;br /&gt; TransactionKey = &amp;#8220;123&amp;#8243;,&lt;br /&gt; LoginId = &amp;#8220;456&amp;#8243;&lt;br /&gt; };&lt;br /&gt; _settingService.SaveSetting(settings);&lt;/p&gt; &lt;p&gt;base.Install();&lt;br /&gt; }&lt;/p&gt; &lt;p&gt;提示：已安装的插件列表可以在\App_Data\InstalledPlugins.txt找到，这个列表是在安装的时候创建的。&lt;/p&gt; &lt;p&gt;升级nopCommerce可能会让插件挂掉&lt;/p&gt; &lt;p&gt;一些插件可能在新版本的nopCommerce中挂掉无法工作。如果在升级后有问题，请删除插件再到nopCommerce官网看看是否有些版本的 插件下载。大部分的插件作者都会把他们的插件升级到新的版本，不过少数插件并不会跟随着一起升级从而不再支持新版本。不过大多数情况下，你可以打开相应的  Description.txt文件并编辑&lt;strong&gt;SupportedVersions&lt;/strong&gt;字段。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;希望此文能让你开始nopCommerce的插件之旅并搞个出类拔萃的插件。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dingsea/aggbug/2381062.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dingsea/archive/2012/03/05/2381062.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2012/02/26/2368743.html</id><title type="text">nopCommerce的源代码结构和架构</title><summary type="text">编写本文档是为了向程序员说明nopcommerce的解决方案结构，亦是程序员开发nopcommerce的居家必备良书。</summary><published>2012-02-26T08:40:00Z</published><updated>2012-02-26T08:40:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2012/02/26/2368743.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2012/02/26/2368743.html"/><content type="html">&lt;div&gt;&lt;p&gt;编写本文档是为了向程序员说明nopcommerce的解决方案结构，亦是程序员开发nopcommerce的居家必备良书。首先 nopcommerce的源代码很容易拿到，它是开源的，所以你可以直接到网上下载。  在你打开VS以后项目和文件夹都会完整列出来，我们建议你在看此文档的同时也打开你的VS来浏览项目和文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;文章说明：文章来源自&lt;a target="_blank" href="http://www.cnblogs.com/dingsea/admin/www.dingsea.com"&gt;我的博客&lt;/a&gt;，于原文之理解而翻译，并非出版社那种按字词翻译风格。欢迎各位提出意见，也欢迎各位转载不过务必注明本文原址。更多   nopcommerce的文章请关注&lt;a target="_blank" href="http://www.dingsea.com/?tag=nopcommerce"&gt;http://www.dingsea.com/?tag=nopcommerce&lt;/a&gt;，或者加入我们的QQ群   101675096&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;绝大多数的项目，目录和文件都顾名思义，你可以从名字就大概知道是做什么的。比如Nop.Plugin.Payments.PayPalStandard这个我都不用看项目代码就能猜到做什么的。&lt;br /&gt; &lt;strong&gt;\Libraries\Nop.Core&lt;/strong&gt;&lt;br /&gt; Nop.Core项目包含nopcommerce的一系列核心类如缓存，事件，辅助类和业务对象(如订单和客户实体类)&lt;br /&gt; &lt;strong&gt;\Libraries\Nop.Data&lt;/strong&gt;&lt;br /&gt; Nop.Data项目包含一系列的数据访问类和方法以从数据库或其他数据媒介读取和保存数据。它也有助于把数据访问逻辑和你的业务对象分离。  nopcommerce使用Entity Framework (EF) Code-First方法，允许你在nopcommerce代码中定义实体  (所有的核心实体类都在Nop.Core中定义)，再让EF生成数据库，这就是为什么会叫Code-First。你接下来可以用LINQ来查询对象，它自 己会把查询转换为SQL语句并在数据库里执行。nopcommerce拥有牛B的API让你完全定制持久映射，你可以在这儿和这儿找到Code- First的资料。&lt;br /&gt; &lt;strong&gt;\Libraries\Nop.Services&lt;/strong&gt;&lt;br /&gt; 此项目包含一系列的核心服务，业务逻辑，验证，如果有数据的话还有数据的计算方法，也就是传说中的业务访问层（BAL）&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Plugins\ 文件夹中的那些项目&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Plugins是VS的解决方案文件夹，硬盘中它是在你解决方案的根目录下。由于项目在编译时的输入路径是&amp;#8221;..\..\Presentation \Nop.Web\Plugins\{Group}.{Name}\&amp;#8221;，这样插件的DLL会自动地放到  \Presentation\Nop.Web\Plugins\文件夹中，用来放置已部署插件。这样也能让插件包含静态文件比如CSS或JS，就不用在项 目之间拷贝这些文件了。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Presentation\Nop.Admin&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Admin是一MVC项目，如果你还从没用过ASP.NET MVC，请猛击&lt;a title="nopcommerce, MVC" href="http://www.asp.net/mvc/" target="_blank"&gt;这儿&lt;/a&gt;有更多信息。可能你已经猜到这是表示层中的管理后台，你可以在 \Presentation\Nop.Web\Administration文件夹中找到它，此项目不能运行。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Presentation\Nop.Web&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Web也是一MVC项目，前台网店的表示层，这个才是你真正要跑起来的项目，它也是整个应用程序的起始项目。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Presentation\Nop.Web.Framework&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Web.Framework是一个表示层的类库项目，包括可以让后台和前台使用的一些共用的展示功能。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Test\Nop.Core.Tests&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Core.Tests是Nop.Core的测试项目&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Test\Nop.Data.Tests&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Data.Tests是Nop.Data的测试项目&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Test\Nop.Services.Tests&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Services.Tests是 Nop.Services的测试项目&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\Test\Nop.Tests&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Tests是一个类库，包含其它测试项目中要用的一共有类和辅助方法，此项目不包含任何测试用例&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dingsea/aggbug/2368743.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dingsea/archive/2012/02/26/2368743.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2012/02/20/2360618.html</id><title type="text">nopCommerce常见问题汇总</title><summary type="text">以下列出的是程序猿攻城湿在开发nopCommerce的时候经常提出的问题。它们也表现出nopCommerce团队对一些架构的选择。</summary><published>2012-02-20T14:40:00Z</published><updated>2012-02-20T14:40:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2012/02/20/2360618.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2012/02/20/2360618.html"/><content type="html">&lt;div&gt;&lt;p&gt;以下列出的是程序猿攻城湿在开发nopCommerce的时候经常提出的问题。它们也表现出nopCommerce团队对一些架构的选择。&lt;/p&gt;&lt;p&gt;文章说明：文章来源自&lt;a target="_blank" href="http://www.cnblogs.com/dingsea/admin/www.dingsea.com"&gt;我的博客&lt;/a&gt;，于原文之理解而翻译，并非出版社那种按字词翻译风格。欢迎各位提出意见，也欢迎各位转载不过务必注明本文原址。更多   nopcommerce的文章请关注&lt;a target="_blank" href="http://www.dingsea.com/?tag=nopcommerce"&gt;http://www.dingsea.com/?tag=nopcommerce&lt;/a&gt;，或者加入我们的QQ群   101675096&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;有哪些要求？&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;NopCommerce的技术和系统要求可以在&lt;a href="http://www.nopcommerce.com/technologysystemrequirements.aspx"&gt;这儿&lt;/a&gt;找到（英文）&lt;/p&gt; &lt;p&gt;&lt;strong&gt;程序猿如何向&lt;/strong&gt;&lt;strong&gt;nopCommerce&lt;/strong&gt;&lt;strong&gt;项目贡献代码？&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;NopCommerce代码托管在codeplex Mercurial代码库，用户&lt;a href="http://nopcommerce.codeplex.com/SourceContro/list/changesets"&gt;点此访问&lt;/a&gt;。借此公共代码库，用户可找到将要发布的修改和以前的设计决策。如果想知道codeplex Mercurial对版本树的支持请在&lt;a href="http://blogs.msdn.com/b/codeplex/archive/2010/03/05/codeplex-mercurial-support-for-forks.aspx"&gt;这儿&lt;/a&gt;和&lt;a href="http://tekpub.com/view/dotnet-oss/7"&gt;这儿&lt;/a&gt;找更多信息。程序猿可以很容易地在我们的&lt;a href="http://www.nopcommerce.com/extensions.aspx"&gt;扩展页面&lt;/a&gt;上传插件和语言包并分享给他人。要上传扩展，请在浏览器中访问&lt;a href="http://www.nopcommerce.com/account.aspx"&gt;我的帐号&lt;/a&gt;，选择&amp;#8220;Your contributions and extensions&amp;#8221;选项卡，然后点击&amp;#8220;Upload a new extension&amp;#8221;按钮。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;我如何报告一个缺陷？&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;nopCommerce使用Codeplex作为官方缺陷跟踪系统，如果发现一个缺陷，可通过在Codeplex创建一个任务来报告给nopCommerce团队。程序猿或用户也可以在我们的&lt;a href="http://www.nopcommerce.com/boards/f/17/bug-reports.aspx"&gt;Bug Reports&lt;/a&gt;论坛版块发帖子来告知新发现的缺陷。如果你的缺陷已经被记录当然最好，正因为此，验证那些没有被记录的缺陷更为重要（比较拗口）。报告重复的缺陷会分心而且让我们在新的开发和改缺陷上时间更少。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;nopCommerce&lt;/strong&gt;&lt;strong&gt;的数据访问层&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nop.Data项目包含一系列的类和函数来读取和写入数据库或是其它数据存储介质。Nop.Data项目有助于将数据访问的逻辑从你的业务对象中 分离出来。NopCommerce使用Entity Framework (EF)  Code-First，Code-First允许程序员在源代码中定义实体（所有核心实体都在Nop.Core项目中定义），然后使用EF来生成基于C# 类的数据库，这就是为何被称为Code-First。你可以用LINQ来查询你的对象，它会悄悄地把代码转化为SQL语句并在数据库执行。 Nopcommerce有流利的API用于完全定制化的持久映射。如果想了解更多Code-First请访问&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx"&gt;这儿&lt;/a&gt;和&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx"&gt;这儿&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;控制反转和依赖注入&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性。控制反转&lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control" target="blank"&gt;Inversion of Control (IoC)&lt;/a&gt; 意味着一个对象不会新创建一个对象并依赖着它来完成工作。相反，它们从外部获取它们想要的对象。依赖注入&lt;a href="http://en.wikipedia.org/wiki/Dependency_injection" target="blank"&gt;Dependency Injection (DI)&lt;/a&gt; 意味着在没有对象的干预下，一般通过能传入构造参数和一系列属性的框架组件完成。马丁虎老二（Martin Fowler）写过一篇关于依赖注入和控制反转的牛B文章，我就不要再抄到这儿了，你可以在&lt;a href="http://martinfowler.com/articles/injection.html"&gt;这儿&lt;/a&gt;找到。NopCommerce使用&lt;a href="http://code.google.com/p/autofac/"&gt;Autofac&lt;/a&gt;类库作为IOC容器。只要你写了一个服务和此服务已实现的适当接口，你应该在任何实现了&lt;strong&gt;IDependencyRegistrar&lt;/strong&gt;接口(Nop.Core.Infrastructure.DependencyManagement 命名空间).的类里注册它。比如所有nopCommerce的核心服务都在Nop.Web.Framework类库的DependencyRegistrar类中已注册。&lt;/p&gt; &lt;p&gt;public class DependencyRegistrar : IDependencyRegistrar&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;builder.Register(c =&amp;gt; c.Resolve().Request)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  .As()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .InstancePerHttpRequest();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  builder.Register(c =&amp;gt; c.Resolve().Response)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  .As()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .InstancePerHttpRequest();&lt;/p&gt; &lt;p&gt;你想创建多少依赖注册类都可以。每一个类实现了&lt;strong&gt;IDependencyRegistrar&lt;/strong&gt;接口的类都有一个&lt;strong&gt;Order&lt;/strong&gt;属性，可以用它来替换一个现有的依赖。要覆盖nopcommerce的依赖，设置order属性为大于0。Nopcommerce会对依赖排序，并按顺序运行，数字越大你的对象越迟被注册。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;我如何注册新的路由（路由？我觉得还是用&lt;/strong&gt;&lt;strong&gt;routes&lt;/strong&gt;&lt;strong&gt;比较好呢？）&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;ASP.NET路由主要用于接受进来的浏览器请求并把它映射到具体的MVC控制器action上。&lt;a href="http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-cs"&gt;在此&lt;/a&gt;有更多信息。Nopcommerce有一个叫&lt;strong&gt;IRouteProvider&lt;/strong&gt;的接口，用于在应用程序开始时注册路由。所有的核心路由都在Nop.Web项目中的&lt;strong&gt;RouteProvider&lt;/strong&gt;注册。&lt;/p&gt; &lt;p&gt;public partial class RouteProvider : IRouteProvider&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;public void RegisterRoutes(RouteCollection routes)&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;//home page&lt;/p&gt; &lt;p&gt;routes.MapLocalizedRoute(&amp;#8220;HomePage&amp;#8221;,&lt;/p&gt; &lt;p&gt;&amp;#8220;&amp;#8221;,&lt;/p&gt; &lt;p&gt;new { controller = &amp;#8220;Home&amp;#8221;, action = &amp;#8220;Index&amp;#8221;},&lt;/p&gt; &lt;p&gt;new[] { &amp;#8220;Nop.Web.Controllers&amp;#8221; });&lt;/p&gt; &lt;p&gt;你想创建多少RouteProvider都可以。比如，如果你的插件有定制路由，需要注册，于是你可以创建一个实现IRouteProvider接口的新类，再根据插件具体注册路由。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;数据校验&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;数据校验是一个用以保证程序操作干净，正确和有用数据的流程。很多.NET程序猿使用Data Annotation Validators，不过nopCommerce用的是&lt;a href="http://fluentvalidation.codeplex.com/" target="blank"&gt;Fluent Validation&lt;/a&gt;， 一个有着文艺青年般的接口和lambda表达式构成的.NET的小型验证库，用以生成符合你业务需求的校验规则  。在nopCommerce中你必须要通过2步来添加一个校验到一些模型中：1.创建一个继承自AbstractValidator的类并把所有必须的验 证逻辑都放入其中，看下边这些应该有所启发：&lt;/p&gt; &lt;p&gt;public class AddressValidator : AbstractValidator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  public AddressValidator(ILocalizationService  localizationService)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RuleFor(x =&amp;gt;  x.FirstName)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .NotEmpty()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  .WithMessage(localizationService.GetResource(&amp;#8220;Address.Fields.FirstName.Required&amp;#8221;))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  .When(x =&amp;gt; !x.FirstNameDisabled);&lt;/p&gt; &lt;p&gt;2.给你的模型类加上ValidatorAttribute属性，比如下边代码：&lt;/p&gt; &lt;p&gt;[Validator(typeof(AddressValidator))]&lt;/p&gt; &lt;p&gt;public class AddressModel : BaseNopEntityModel&lt;/p&gt; &lt;p&gt;{&lt;br /&gt; 当一个视图模型被提交到控制器，ASP.NET会执行相应的校验。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;计划任务&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;有了计划任务，你可以安排一个任务在指定的时期里，在后台运行。比如nopCommerce会定时地发送队列中的email。任务是在ASP.NET线程池中由单独的线程执行。创建一个新的任务有如下基本步骤：&lt;/p&gt; &lt;ol start="1"&gt;&lt;li&gt;定义一个有&lt;strong&gt;ITask&lt;/strong&gt;接口的类，它只有一个无参数的方法：&lt;strong&gt;Execute&lt;/strong&gt;。在任务要执行的时候，这个方法会被调用，你懂的。&lt;/li&gt;&lt;li&gt;为了设定一个计划任务，程序员必须在数据库相应的表中添加一个&lt;strong&gt;ScheduleTask&lt;/strong&gt;记录。你可以使用&lt;strong&gt;IScheduleTaskService&lt;/strong&gt;来添加记录&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;事件暴露和处理&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;事件是把消息广播给感兴趣的部分。事件是由数据驱动的如添加，更新和删除数据。NopCommerce允许程序员&amp;#8220;监听&amp;#8221;他们感兴趣的事件。程序员要想玩转事件基本上有如下两条路走，一个程序员要么发布某个事件让其它人来用，要么用别的程序员编好并发布的事件。&lt;/p&gt; &lt;ol&gt;&lt;li&gt;程序员为了发布一个事件，必须先取得一个&lt;strong&gt;IEventPublisher&lt;/strong&gt;实例再使用相应的数据一起调用&lt;strong&gt;Publish&lt;/strong&gt;方法。&lt;/li&gt;&lt;li&gt;程序员要监听一个事件，他必须实现一个新的&lt;strong&gt;IConsumer&lt;/strong&gt;泛型接口，一旦有人使用这个事件，nopCommerce会用反射来寻找并注册这个事件的实现。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;设置&lt;/strong&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;正如其它网站平台，nopCommerce也有例如&amp;#8220;网店名称&amp;#8221;或&amp;#8220;启用单页购买&amp;#8221;这类设置，在nopCommerce中有两种办法来管理设置。&lt;/p&gt; &lt;p&gt;你可以用实现&lt;strong&gt;ISettingService&lt;/strong&gt;接口的方法&lt;strong&gt;SetSetting&lt;/strong&gt;和&lt;strong&gt;GetSettingByKey&lt;/strong&gt;来加载和保存单个设置。而在nopCommerce中最牛B的处理设置的办法是创建一个&lt;strong&gt;ISettingService&lt;/strong&gt;接口的新实现。每个设置将变为C#属性，程序员在需要时应该使用setting类构建函数注入设置。以下是setting类的示例代码。&lt;/p&gt; &lt;p&gt;/* 小结：本文是按老丁于原文之理解而翻译，并非出版社那种按字词翻译风格。欢迎各位提出意见，也欢迎各位转载不过务必注明本文原址。更多  nopcommerce的文章请关注http://www.dingsea.com/?tag=nopcommerce，或者加入我们的QQ群  101675096讨论。&lt;br /&gt; */&lt;br /&gt; public class MediaSettings : ISettings&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;public int AvatarPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int ProductThumbPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int ProductDetailsPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int ProductThumbPictureSizeOnProductDetailsPage { get; set; }&lt;/p&gt; &lt;p&gt;public int ProductVariantPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int CategoryThumbPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int ManufacturerThumbPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;public int CartThumbPictureSize { get; set; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;public bool DefaultPictureZoomEnabled { get; set; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;public int MaximumImageSize { get; set; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dingsea/aggbug/2360618.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dingsea/archive/2012/02/20/2360618.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2010/02/23/1671670.html</id><title type="text">为nopcommerce自定义用户积分功能(2)</title><summary type="text">nopcommerce的总体架构我们就不多说了，从WEB到逻辑再到数据库访问都有地方要修改，本文主要演示逻辑和数据库访问的修改，Web界面上的后边会提到如何调用。</summary><published>2010-02-23T01:31:00Z</published><updated>2010-02-23T01:31:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2010/02/23/1671670.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2010/02/23/1671670.html"/><content type="text">nopcommerce的总体架构我们就不多说了，从WEB到逻辑再到数据库访问都有地方要修改，本文主要演示逻辑和数据库访问的修改，Web界面上的后边会提到如何调用。</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2010/02/22/1670929.html</id><title type="text">为nopcommerce自定义用户积分功能(1)</title><summary type="text">nopcommerce是开源的asp.net网店，从08年底出来第一个版本，截止本文发稿时最新版本为1.40，有兴趣的同学可以去http://www.nopcommerce.com了解详细情况。nopcommerce本身不带用户积分功能，至少1.4还没有。基本目前的用户需求，等不到官方发布这个功能了。我们来自己实现一个简单的用户积分，积分历史记录暂时通过SQL查询</summary><published>2010-02-22T02:16:00Z</published><updated>2010-02-22T02:16:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2010/02/22/1670929.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2010/02/22/1670929.html"/><content type="text">nopcommerce是开源的asp.net网店，从08年底出来第一个版本，截止本文发稿时最新版本为1.40，有兴趣的同学可以去http://www.nopcommerce.com了解详细情况。nopcommerce本身不带用户积分功能，至少1.4还没有。基本目前的用户需求，等不到官方发布这个功能了。我们来自己实现一个简单的用户积分，积分历史记录暂时通过SQL查询</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2007/03/16/676883.html</id><title type="text">[转]笑话: 耐力惊人的三只乌龟</title><summary type="text"/><published>2007-03-16T02:16:00Z</published><updated>2007-03-16T02:16:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2007/03/16/676883.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2007/03/16/676883.html"/><content type="text"/></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2007/02/28/659040.html</id><title type="text">[转]华人总结“十个”出了国才能知道秘密！</title><summary type="text">转自某网站,个人比较同意其中部分观点.</summary><published>2007-02-28T01:52:00Z</published><updated>2007-02-28T01:52:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2007/02/28/659040.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2007/02/28/659040.html"/><content type="text">转自某网站,个人比较同意其中部分观点.</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2007/01/16/621646.html</id><title type="text">[转]两名清洁女工谈论萨达姆之死</title><summary type="text"/><published>2007-01-16T05:35:00Z</published><updated>2007-01-16T05:35:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2007/01/16/621646.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2007/01/16/621646.html"/><content type="text"/></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2007/01/10/616634.html</id><title type="text">[转]IT人士健康频亮红灯 八种易发病请对号入座</title><summary type="text">为数众多的普通IT人的健康状况更让人担忧，甚至网络上流传的“四十岁以前用健康换钱，四十岁以后用钱买健康”也成为众多IT人的酸楚心声。</summary><published>2007-01-10T05:51:00Z</published><updated>2007-01-10T05:51:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2007/01/10/616634.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2007/01/10/616634.html"/><content type="text">为数众多的普通IT人的健康状况更让人担忧，甚至网络上流传的“四十岁以前用健康换钱，四十岁以后用钱买健康”也成为众多IT人的酸楚心声。</content></entry><entry><id>http://www.cnblogs.com/dingsea/archive/2006/09/07/497696.html</id><title type="text">[转]IBM ThinkPad 全新、原装机验机流程（完全版）</title><summary type="text">做工不错。外壳看上去不错。</summary><published>2006-09-07T08:42:00Z</published><updated>2006-09-07T08:42:00Z</updated><author><name>极地银狐.NET</name><uri>http://www.cnblogs.com/dingsea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dingsea/archive/2006/09/07/497696.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dingsea/archive/2006/09/07/497696.html"/><content type="text">做工不错。外壳看上去不错。</content></entry></feed>
