﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-郁闷的翩翩</title><link>http://www.cnblogs.com/darkdawn/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 23 Nov 2008 20:50:45 GMT</lastBuildDate><pubDate>Sun, 23 Nov 2008 20:50:45 GMT</pubDate><ttl>60</ttl><item><title>一个小Forum Web程序示例，SqlForumRepository，LazyList和PagedList（Part 3）</title><link>http://www.cnblogs.com/darkdawn/archive/2008/10/04/1303821.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Sat, 04 Oct 2008 07:54:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/10/04/1303821.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1303821.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/10/04/1303821.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1303821.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1303821.html</trackback:ping><description><![CDATA[摘要: 好久没写了。接着前面的来：一个小Forum Web程序示例，ASP.NET MVC Framework，总体结构介绍（Part 1）一个小Forum Web程序示例，ASP.NET MVC Framework，TDD简介（Part 2）上一部分写得太长太详细，这次争取描述清楚的前提下，写简短一点。上部分中，简单介绍了TDD流程，并创建了一些测试，这部分我将进一步完善，开始实现真实的SqlFourm&nbsp;&nbsp;<a href='http://www.cnblogs.com/darkdawn/archive/2008/10/04/1303821.html'>阅读全文</a><img src ="http://www.cnblogs.com/darkdawn/aggbug/1303821.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43630/" target="_blank">[新闻]Silverlight 2 SDK中文版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>一个小Forum Web程序示例，ASP.NET MVC Framework，TDD简介（Part 2）</title><link>http://www.cnblogs.com/darkdawn/archive/2008/09/24/1298391.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Wed, 24 Sep 2008 15:06:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/09/24/1298391.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1298391.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/09/24/1298391.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1298391.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1298391.html</trackback:ping><description><![CDATA[<p>前一部分我简单介绍了这个论坛程序的结构（Repository的方法返回IQueryable类型）和在ASP.NET MVC Framework中使用StructureMap。</p>
<p>文章地址：<a title="http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html" href="http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html">http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html</a></p>
<p>这一部分我想比较详细的介绍一下MVC中进行TDD的过程和使用<a href="http://www.jetbrains.com/resharper/" target="_blank">Resharper</a> 4.0生成方法（这个活Class Diagram也可以干，不过没Resharper方便）。</p>
<p>我把步骤尽量写得详细一点，这样虽然文章长一点，但是读起来可能没那么费劲。</p>
<p>接着上一个例子，现在我需要读取论坛的分类详细信息。</p>
<p>在TinyForum.Service项目中，利用Class Diagram为IForumService创建了两个方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="529" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_1.png" width="563" border="0" /></a> </p>
<p>现在代码不能通过编译，因为我的ForumService类并没有实现接口的方法，这时候可以使用Resharper来非常简单的完成这个工作：</p>
<p>把鼠标指向红色下划线上，前面会出现一个红色的灯泡，然后点击灯泡，会看到有实现成员的选项，别犹豫，点下去。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="322" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_2.png" width="550" border="0" /></a> </p>
<p>这时会出来一个对话框，有相应的选项，直接点Finish就行。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_8.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="554" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_3.png" width="552" border="0" /></a> </p>
<p>看看都生成了些什么：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_10.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="225" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_4.png" width="406" border="0" /></a> </p>
<p>很好，这正是我所想要的。是时候该为他们创建单元测试了。在方法名称上点击右键，选择&#8220;创建单元测试&#8221;。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_12.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="204" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_5.png" width="472" border="0" /></a> </p>
<p>然后点击确定，看到VS.NET为该方法生成的单元测试：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_14.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="285" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_6.png" width="828" border="0" /></a> </p>
<p>这时候我们需要修改这个单元测试，让它能测试一些东西，而现在什么也测试不了，因为我们连一个数据库都没有。没关系，只要有IForumRepository接口的实例就OK了，但是之前我们建立的SqlForumRepository仍然需要数据库的支持。没办法了，只有在测试项目中建立一个只用来测试的IForumRepository了（在测试代码中创建专门为测试使用的Repository，这样做有问题么？）。</p>
<p>首先在测试项目中添加对所有项目的引用，然后建立一个TestForumRepository类，实现IForumRepository，同样利用Resharper生成接口成员：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_16.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="282" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_7.png" width="494" border="0" /></a> </p>
<p>我们需要一些通用的实体类（非LINQ TO SQL CLASSES）（注意用Class Diagram生成的代码需要修改，setter都是NotImplementedException）：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_18.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="215" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_8.png" width="462" border="0" /></a> </p>
<p>现在我们需要为这个Repository增加一些测试内容，并实现GetCategory方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_22.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="565" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_10.png" width="988" border="0" /></a> </p>
<p>好了，为这个测试类增加一个IForumService的实例，并修改测试方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_24.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="413" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_11.png" width="962" border="0" /></a> </p>
<p>如图，在类中增加了一个IForumRepository成员，并由TestForumRepository来实例化它，由于Category类是引用类型，有不同的引用，所以我分别测试了它们的内容是否一致，OK，现在运行这个测试，发现没有通过：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_26.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="136" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_12.png" width="690" border="0" /></a> </p>
<p>因为我们没有实现ForumService.GetCategories方法（抛出System.NotImplementedException异常），现在是时候重构了，修改GetCategory方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_28.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="94" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_13.png" width="507" border="0" /></a> </p>
<p>编译，运行测试，第一个测试亮了绿灯，呵呵。</p>
<p>但是这个测试还不够完善，比如，我们没有测试，如果查找的不存在的ID，会有什么结果？这里我希望它能抛出一个自定义异常CategoryNotFoundException，修改Category.cs文件，为它添加一个异常类：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_30.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_14.png" width="460" border="0" /></a> </p>
<p>好咯，现在再生成一个测试方法，并修改如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_34.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="176" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_16.png" width="534" border="0" /></a> </p>
<p>我们希望能抛出一个这样的异常，运行这个测试，红灯亮，结果是并没有抛出我所期望的异常，看来我的代码有问题，需要重构：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_38.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_18.png" width="614" border="0" /></a> </p>
<p>现在运行测试通过，在找不到数据的时候，会抛出我想要的异常。</p>
<p>下面我想测试一下这个代码是否能在MVC中正常的运行，首先我在Controllers目录下创建一个MVC Controller：ForumController，为这个controller创建一个对IForumService的关联，并在构造器中赋值：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_52.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="347" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_25.png" width="457" border="0" /></a> </p>
<p>OK，现在在List方法上点击右键，生成测试，并修改测试方法（由于MVC对视图良好的分离，所以我在这里不用关心视图做了什么）：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_54.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="225" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_26.png" width="779" border="0" /></a> </p>
<p>编译并运行测试，测试没有通过：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_56.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="171" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_27.png" width="471" border="0" /></a> </p>
<p>原因是我们没有实现List方法，修改代码：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_58.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="123" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_28.png" width="427" border="0" /></a> </p>
<p>测试又一次失败了，错误信息是&#8220;Failed&nbsp;&nbsp;&nbsp; ListTest&nbsp;&nbsp;&nbsp; TinyForum.Tests&nbsp;&nbsp;&nbsp; Test method TinyForum.Tests.ForumControllerTest.ListTest threw exception:&nbsp; TinyForum.Data.Models.CategoryNotFoundException: Category Not Found..&nbsp;&nbsp;&nbsp; &#8221;，看来是测试用例有问题（使用new Guid()当然是找不到内容的），修改测试代码，在实例化GUID的时候使用TestForumRepository中成员IList已有的GUID，运行测试，通过。</p>
<p>稍微改进一下测试代码：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_60.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="260" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_29.png" width="832" border="0" /></a> </p>
<p>开始测试，所有绿灯都亮了：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_62.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="169" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_14B87/image_thumb_30.png" width="472" border="0" /></a>&nbsp;</p>
<p>重复上面的步骤，我继续做了查找Posts的并分页操作（我使用了<a href="http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/" target="_blank">PagedList&lt;T&gt;</a>来获取分页数据，并在TestForumRepository中加了一些测试数据），这里就不贴出来了。</p>
<p>到这里就差不多了，由于TDD我也处于摸索阶段，可能有很多错误和不足，希望前辈们加以指正。下一部分我将创建一个数据库，并完善一个SqlForumRepository。</p>
<img src ="http://www.cnblogs.com/darkdawn/aggbug/1298391.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43629/" target="_blank">[新闻][译稿]微软将 jQuery IntelliSense整合到Visual Studio</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>一个小Forum Web程序示例，ASP.NET MVC Framework，总体结构介绍（Part 1）</title><link>http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Tue, 23 Sep 2008 14:00:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1297464.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1297464.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1297464.html</trackback:ping><description><![CDATA[<h2>本文简单介绍以下内容： </h2>
<p>1. <a href="http://martinfowler.com/eaaCatalog/repository.html" target="_blank">Repository</a>模式简介以及结合IQueryable改进的Repository模式；
<p>2. 简单的TDD实践，使用<a href="http://www.jetbrains.com/resharper/" target="_blank">ReSharper 4.0</a>插件简化操作；
<p>3. 结合使用依赖注入(<a href="http://www.martinfowler.com/articles/injection.html" target="_blank">Dependency Injection</a>[<a href="http://www.cnblogs.com/me-sa/archive/2008/07/30/iocdi.html" target="_blank">中文翻译</a>])工具<a href="http://sourceforge.net/projects/structuremap" target="_blank">StructureMap</a>[<a href="http://structuremap.sourceforge.net/StructureMap-API.chm" target="_blank">文档下载</a>]，实现模块之间的松散耦合。
<p>4. 提供一个很简单的论坛程序示例，Step by Step介绍以上内容。
<p>差不多内容的blog示例在Codeplex上也早就有了，介绍MVC TDD和StructureMap的英文文章也挺多，本人才疏学浅，文采很烂，写本文是一是为了自己更深的掌握这些内容，二是为了让喜爱MVC的朋友也能获得一些帮助，也是第一次写东西放首页上，请各位前辈多提意见和建议。
<h3>Repository简介</h3>
<p>介绍Repository的文章比较少，其实这个模式相当简单，首先对它做一个简单的介绍：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="248" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb.png" width="571" border="0" /></a>
<p>这就是一个比较简单的Repository模式，首先创建一个IRepository接口，这个接口定义一系列契约，然后创建一个实现这个接口的类，负责它的具体操作。然后在Context中对它进行实例化（在本示例中，实例由依赖注入框架完成）。
<p>当然这个模式还可以结合简单工厂模式对它进行扩充，由工厂来完成它的实例创建工作。
<p>&nbsp;
<h3>应用程序整体结构</h3>
<p>下面介绍一下本示例的结构，也是比较简单的： </p>
<p>首先，我们使用ASP.NET MVC Framwork Preview 5，所有的操作（发帖、回帖、删帖等）都是由在相应的Controller中的Action来完成的。关于MVC这里就不做详细介绍了。我这里创建了一个类库项目：TinyForum.Service，在这个项目中，创建一个IForumService定义一组契约，我们在Controller中需要一个它的实例字段（为了好看，图中为属性，字段在Class diagram中不显示关系）来完成操作（如图）。
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="325" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_1.png" width="510" border="0" /></a>
<p>上图中的ForumService类中，需要对数据操作进行封装。为了使用不同的数据库，还得建立一个项目：TinyForum.Data，在这个项目中，我们会定义一个IForumRepository接口，又由这个接口定义一组对数据库的操作，所有操作返回类型都为<strong>IQueryable类型</strong>，这样非常的方便，在ForumService中就可以对它进行任意的转换，也不会因为返回大量的IList还可能需要做进一步的筛选影响性能。
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="262" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_2.png" width="582" border="0" /></a>
<p>这是ForumService的实现：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="409" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_3.png" width="573" border="0" /></a>
<p>这是IForumRepository的定义(随意定义了2个方法)：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_10.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="285" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_4.png" width="469" border="0" /></a>
<p>很显然，在ForumService中，需要一个对IForumRepository的依赖，在实现的代码中，我们创建了一个构造方法来获得这个对象，这时候出现一个麻烦问题，因为我们需要在上下文中去创建我们需要的IForumRepository的实例，这样做会造成可能需要修改ForumService的代码，这样是违反OCP原则的；</p>
<p>同时ForumController也需要一个对IForumService的依赖，并且要在构造方法中获得它的示例，而MVC默认的Controller构造方法是无参的，编译可以通过，不过运行的时候会得到一个黄色的异常页面，大概是这样： </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_16.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="179" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_7.png" width="742" border="0" /></a> </p>
<p>看来需要使用一个依赖注入工具来解救我们。我这里使用的StructureMap。
<p>在Web项目中，添加StructureMap引用，并在Controllers目录下添加一个StructureMapControllerFactory，如图：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="476" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_5.png" width="724" border="0" /></a>&nbsp;
<p>然后我们需要为StructureMap做一点配置，让它知道该做什么，首先创建一个StructureMap的注册表：ForumRegistry
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_26.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="400" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_12.png" width="578" border="0" /></a>
<p>另外还要添加一个注册表，用于让SqlRepository获得ForumDataContext（Linq）:
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_28.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="402" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_13.png" width="729" border="0" /></a>&nbsp;
<p>都不是很复杂，代码已经解释得很详细了，就不做累述了。
<p>最后需要添加一个Bootstrapper，并添加到Global.asax.cs中去，启动的时候就执行。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_30.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="328" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_14.png" width="653" border="0" /></a> </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_22.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="161" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_10.png" width="735" border="0" /></a> </p>
<p>基本结构就介绍到这里。</p>
<p>目前的解决方案截图：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_32.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="701" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/WindowsLiveWriter/For.NETMVCFrameworkRepositoryIQueryableT_113A4/image_thumb_15.png" width="270" border="0" /></a> </p>
<p>怕文章又臭又长，所以干脆分开写(至少不长，呵呵)，下一个部分将介绍使用Resharper插件、和TDD步骤，并象征性实现一些基本的功能。</p>
<img src ="http://www.cnblogs.com/darkdawn/aggbug/1297464.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43628/" target="_blank">[新闻]微软：不裁员也不削减研发开支</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>可更换风格的Html和Css示例</title><link>http://www.cnblogs.com/darkdawn/archive/2008/09/10/1288367.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Wed, 10 Sep 2008 07:06:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/09/10/1288367.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1288367.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/09/10/1288367.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1288367.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1288367.html</trackback:ping><description><![CDATA[摘要: 一直不知道写开场白，就省略吧，直接开始：一直想做一个可以更换风格的html和css界面，最近做了一个blog皮肤，总结了一些经验技巧，个人觉得还不错，所以写出来给大家分享分享。本文通过一个简单的示例，介绍：1、页面中使用em单位的中文字体；2、用纯css做各种不同颜色的皮肤，应用在页面上；3、使用javascript应用不同的皮肤，方便用户随时切换；4、使用javascript和cookie，把用&nbsp;&nbsp;<a href='http://www.cnblogs.com/darkdawn/archive/2008/09/10/1288367.html'>阅读全文</a><img src ="http://www.cnblogs.com/darkdawn/aggbug/1288367.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43625/" target="_blank">[新闻]2008年11月22日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[翻译]StructureMap 指南 – .NET中的依赖注入和控制反转 </title><link>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1284018.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Thu, 04 Sep 2008 06:57:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1284018.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1284018.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1284018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1284018.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1284018.html</trackback:ping><description><![CDATA[<p style="margin-left: 63pt; text-align: left; text-indent: -63pt; line-height: 13.2pt;" align="left"><strong><span style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: #666666;">原文地址：</span></strong><a href="http://www.pnpguidance.net/Post/StructureMapTutorialDependencyInjectionIoCNET.aspx"><strong></strong>http://www.pnpguidance.net/Post/StructureMapTutorialDependencyInjectionIoCNET.aspx</a><strong></strong><strong></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 200%;" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;"><a href="http://sourceforge.net/projects/structuremap">StuctureMap</a></span></strong> <span style="font-size: 10pt; line-height: 200%; font-family: 宋体; color: #666666;">是一种</span><span style="font-size: 10pt; line-height: 200%; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">.NET</span><span style="font-size: 10pt; line-height: 200%; font-family: 宋体; color: #666666;">下的依赖注入框架，希望</span><span style="font-size: 10pt; line-height: 200%; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">2.5</span><span style="font-size: 10pt; line-height: 200%; font-family: 宋体; color: #666666;">版早点发布（目前最新是</span><span style="font-size: 10pt; line-height: 200%; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">2.4.9</span><span style="font-size: 10pt; line-height: 200%; font-family: 宋体; color: #666666;">）。这篇指南可以帮助您入门。</span></p>
<p style="margin-bottom: 3.75pt; text-align: left; line-height: 13.2pt;" align="left"><strong><span style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span></strong><strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">依赖注入基础</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">在大多数</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ASP.NET WEB</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">应用程序、智能客户端程序、</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">WPF</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">程序中，你都可以通过提供接口，创建可重用的服务。如：你定义一个接口叫</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">，这个接口声明一组契约，为你的程序记录日志，并且你做了不同的、可重用的实现这个接口的类，如：类</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">，把日志记录到数据库中。</span><img id="5" anchorname="OLE_LINK4" src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Images/anchor.gif" alt="" /></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">当有一个对</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">请求的时候，我们可以叫</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">注入返回一个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的实例：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;.ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DatabaseLogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
</span></div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">我们可以使用</span><strong><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMapConfiguration</span></strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类创建一个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">Singleton</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">模式的</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">，也就是在整个应用程序中有且仅有一个实例的</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">。</span></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">你可以使用</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的</span><strong><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ObjectFactory</span></strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类取出这个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的实例：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">ILogger&nbsp;logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();</span></div>
<p style="text-align: left; line-height: 16.8pt;" align="left"></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">会返回一个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的实例，之前我们已经做好了</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">DatabaseLogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">对</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的映射。</span></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">然后把这些代码放到一个最简单的控制台应用程序中：</span></p>
<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;StructureMapTutorials<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DatabaseLogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILogger&nbsp;logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p>
<p></p>
<p>&nbsp;</p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogger&nbsp;{}</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: black;">&nbsp;&nbsp; </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: blue;">public</span> <span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: blue;">class</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: black;"> DatabaseLogger : </span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: blue;">ILogger</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: black;"> {}</span></p>
<p style="text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: black;">}</span></p>
</div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left">&nbsp;<span style="font-size: 10pt; font-family: 宋体; color: #666666;">更精彩的是：</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;"> StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">会自动在对象中注入所依赖的对象实例。比如我们的程序里还有个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">CustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类，也需要</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">服务：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ICustomerDataSource&nbsp;{&nbsp;}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CustomerDataSource&nbsp;:&nbsp;ICustomerDataSource<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">readonly</span><span style="color: #000000;">&nbsp;ILogger&nbsp;_logger;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CustomerDataSource(ILogger&nbsp;logger)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;logger;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">我们把</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ICustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">接口的具体实现</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">CustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类也注册到</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">中，就像刚才的</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">服务一样：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;.ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);</span></div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">and then we can ask for an instance of ICustomerDataSource from StructureMap's ObjectFactory Class, <img id="8" anchorname="OLE_LINK22" src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Images/anchor.gif" alt="" />which&nbsp;automatically injects the propery ILogger Service into the CustomerDataSource Class' Constructor for us:</span></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">然后，我们向</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ObjectFactory</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类请求一个</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ICustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的实例，它会自动把</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">属性注入服务到</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">CustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">类的构造方法中：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">ICustomerDataSource&nbsp;dataSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();</span></div>
<p style="text-align: left; line-height: 16.8pt;" align="left"></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">你可以通过下面的控制台程序看到</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">是怎样运行的：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap.Attributes;<br />
<br />
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;StructureMapTutorials<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DatabaseLogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICustomerDataSource&nbsp;dataSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogger&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DatabaseLogger&nbsp;:&nbsp;ILogger&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ICustomerDataSource&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CustomerDataSource&nbsp;:&nbsp;ICustomerDataSource<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">readonly</span><span style="color: #000000;">&nbsp;ILogger&nbsp;_logger;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CustomerDataSource(ILogger&nbsp;logger)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;logger;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p style="text-align: left; line-height: 16.8pt;" align="left"><strong>&nbsp;</strong></p>
<p style="margin-bottom: 3.75pt; text-align: left; line-height: 13.2pt;" align="left"><strong><span style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span></strong><strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">注册表</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">通常依赖注入和控制反转工具都有以组关系注册的方式。</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">有</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">&#8221;</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">注册表</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">&#8221;</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的概念。我们可以改变上面的代码，把</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ILogger</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">和</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ICustomerDataSource</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">放到一组叫</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">ServiceRegistry</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">的类中注册。</span></p>
<br />
<div class="cnblogs_code"><img id="Code_Closed_Image_150119" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_150119').style.display='none'; document.getElementById('Code_Open_Image_150119').style.display='inline'; document.getElementById('Code_Open_Text_150119').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" height="16"><img id="Code_Open_Image_150119" style="display: none;" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_150119').style.display='none'; getElementById('Code_Closed_Image_150119').style.display='inline'; getElementById('Code_Closed_Text_150119').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" height="16"><span id="Code_Closed_Text_150119" class="cnblogs_code_Collapse">Code</span><span id="Code_Open_Text_150119" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap.Attributes;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap.Configuration.DSL;<br />
<br />
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;StructureMapTutorials<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddRegistry(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ServiceRegistry());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICustomerDataSource&nbsp;dataSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ServiceRegistry&nbsp;:&nbsp;Registry<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;configure()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ILogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DatabaseLogger</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForRequestedType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.TheDefaultIsConcreteType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CacheBy(InstanceScope.Singleton);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogger&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DatabaseLogger&nbsp;:&nbsp;ILogger&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ICustomerDataSource&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CustomerDataSource&nbsp;:&nbsp;ICustomerDataSource<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">readonly</span><span style="color: #000000;">&nbsp;ILogger&nbsp;_logger;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CustomerDataSource(ILogger&nbsp;logger)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;logger;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></span></div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><strong>&nbsp;</strong></p>
<p style="margin-bottom: 3.75pt; text-align: left; line-height: 13.2pt;" align="left"><strong><span style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap PluginFamily</span></strong><strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">和</span></strong><strong><span style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: #666666;">Pluggable</span></strong><strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">特性</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">如果你愿意使用特性让</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">扫描不同的程序集并自动注册不同的类型到你的程序，你可以使用</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">PluginFamily</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">和</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">Pluggable</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">特性：</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap.Attributes;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;StructureMap.Configuration.DSL;<br />
<br />
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;StructureMapTutorials<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StructureMapConfiguration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ScanAssemblies()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.IncludeTheCallingAssembly();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICustomerDataSource&nbsp;dataSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectFactory.GetInstance</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ICustomerDataSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[PluginFamily(</span><span style="color: #800000;">"</span><span style="color: #800000;">Database</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;IsSingleton&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogger&nbsp;{&nbsp;}<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[Pluggable(</span><span style="color: #800000;">"</span><span style="color: #800000;">Database</span><span style="color: #800000;">"</span><span style="color: #000000;">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DatabaseLogger&nbsp;:&nbsp;ILogger&nbsp;{&nbsp;}<br />
<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;[PluginFamily(</span><span style="color: #800000;">"</span><span style="color: #800000;">CustomerDataSource</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;IsSingleton&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ICustomerDataSource&nbsp;{&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[Pluggable(</span><span style="color: #800000;">"</span><span style="color: #800000;">CustomerDataSource</span><span style="color: #800000;">"</span><span style="color: #000000;">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CustomerDataSource&nbsp;:&nbsp;ICustomerDataSource<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">readonly</span><span style="color: #000000;">&nbsp;ILogger&nbsp;_logger;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CustomerDataSource(ILogger&nbsp;logger)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;logger;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left">&nbsp;</p>
<p style="margin-bottom: 3.75pt; text-align: left; line-height: 13.2pt;" align="left"><strong><span style="font-size: 10pt; font-family: 宋体; color: #666666;">结语</span></strong></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">这篇文章介绍了些在</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">.NET</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">中使用</span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">StructureMap</span><span style="font-size: 10pt; font-family: 宋体; color: #666666;">框架依赖注入和控制反转的基础知识。</span></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">你也可以试试这些工具：</span><a href="http://www.pnpguidance.net/Tag/Autofac.aspx"><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">Autofac</span></span></a><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">, </span></span><a href="http://www.pnpguidance.net/Tag/CastleWindsor.aspx"><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">Castle Windsor</span></span></a><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">, </span></span><a href="http://www.pnpguidance.net/Tag/Ninject.aspx"><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">Ninject</span></span></a><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">, </span></span><a href="http://www.pnpguidance.net/Tag/SpringFramework.aspx"><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">SpringFramework.net</span></span></a><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; color: #666666;">, </span></span><a href="http://www.pnpguidance.net/Category/Unity.aspx"><span><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">Unity</span></span></a><span style="font-size: 10pt; font-family: 宋体; color: #666666;">。</span></p>
<p style="margin: 7.5pt 0cm; text-align: left; line-height: 16.8pt;" align="left"><span style="font-size: 10pt; font-family: 宋体; color: #666666;">希望对您有所帮助，</span><a href="http://www.davidhayden.com/"><span style="font-size: 10pt; font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">David Hayden</span></a><span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/darkdawn/aggbug/1284018.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43624/" target="_blank">[新闻]诺基亚将支持Lotus Notes 和黑莓争夺市场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[翻译]在ASP.NET MVC中使用TDD与依赖注入</title><link>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1283692.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Thu, 04 Sep 2008 02:38:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1283692.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1283692.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/09/04/1283692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1283692.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1283692.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;">
<p><span style="font-family: 宋体;">（代码截图为ASP.NET MVC </span>Preview 5版本<span style="font-family: 宋体;">）</span></p>
<p>原文地址：<a href="http://haacked.com/archive/2007/12/07/tdd-and-dependency-injection-with-asp.net-mvc.aspx">http://haacked.com/archive/2007/12/07/tdd-and-dependency-injection-with-asp.net-mvc.aspx</a> </p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在设计</span>ASP.NET MVC Framework<span style="font-family: 宋体;">的时候，指导原则之一是要能使用</span>TDD<span style="font-family: 宋体;">（测试驱动开发）建立</span>web<span style="font-family: 宋体;">应用程序。本文使用</span>ASP.NET MVC CodePlex Preview 4<span style="font-family: 宋体;">为例（经过测试，代码可以在</span>Preview 5<span style="font-family: 宋体;">中运行，翻译版截图全部为</span>Preview 5<span style="font-family: 宋体;">），我将试着保持这篇文章的内容适用于最新的</span>ASP.NET MVC Framework<span style="font-family: 宋体;">，但是需要多一点点的时间。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">本文提供一个稍具测试驱动开发（</span>TDD<span style="font-family: 宋体;">）风格的</span>web<span style="font-family: 宋体;">程序，同时介绍把</span><a href="http://structuremap.sourceforge.net/Default.htm">StructureMap</a> DI<span style="font-family: 宋体;">（<a href="http://www.martinfowler.com/articles/injection.html">依赖注入</a>）框架集成到这个</span>ASP.NET MVC<span style="font-family: 宋体;">示例中。在本文结尾处你可以下载代码。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">我选择了</span>StructureMap 2.0<span style="font-family: 宋体;">依赖注入框架，因为我对它比较熟悉，并且它只需要做很少的代码和配置。如果你想把这个示例换成使用</span><a href="http://www.springframework.net/">Spring.NET</a><span style="font-family: 宋体;">，可以到</span><a href="http://weblogs.asp.net/fredriknormen/archive/2007/11/17/asp-net-mvc-framework-create-your-own-icontrollerfactory-and-use-spring-net.aspx" title="ASP.NET MVC Framework Create your own IControllerFactory"><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #d03010;">Fredrik Normen&#8217;s post</span></a><span style="font-family: 宋体; color: #333333;">查看。以后我可能会写点使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;"><a href="http://www.castleproject.org/container/index.html">Castle Windsor</a></span><span style="font-family: 宋体; color: #333333;">和</span><a href="http://www.codeplex.com/ObjectBuilder"><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ObjectBuilder</span></a><span style="font-family: 宋体; color: #333333;">的代码示例。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Start Me Up</span></strong><strong><span style="font-family: 宋体; color: #333333;">！</span></strong><span style="font-family: 宋体; color: #333333;">（向滚石乐队致歉）</span></p>
<p><span style="font-family: 宋体; color: #333333;">首先安装好</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">VS2008</span><span style="font-family: 宋体; color: #333333;">以及</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ASP.NET MVC</span><span style="font-family: 宋体; color: #333333;">，打开</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Visual Studio 2008</span><span style="font-family: 宋体; color: #333333;">并选择</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">File|New Project,</span><span style="font-family: 宋体; color: #333333;">在对话窗口中选择</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ASP.NET MVC Application</span><span style="font-family: 宋体; color: #333333;">模板。</span></p>
</span>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;"><img alt="" src="http://images.cnblogs.com/cnblogs_com/darkdawn/MVC/StructureMap/1.jpg" width="829" height="630" /></span></p>
<p><span style="font-family: 宋体; color: #333333; font-size: 14pt;">然后选择单元测试项目选择对话框。</span></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/2.jpg" width="606" border="0" height="455" /></p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">默认安装下，只有</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Visual Studio Unit Test</span><span style="font-family: 宋体; color: #333333;">项目选项可用。但是安装了</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">MbUnit</span><span style="font-family: 宋体; color: #333333;">，</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">xUnit</span><span style="font-family: 宋体; color: #333333;">等等其他框架也会在这里显示出来。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">你可能会猜想，我会从建立一个很权威的</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">blog</span><span style="font-family: 宋体; color: #333333;">例子，其实我会从没有数据库的示例开始，我们可以以后慢慢添加。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">第一件我想做的事是添加一些类文件到主项目中去。我不会添加任何实现，能编译就行。我首先添加这些：</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controllers</span><span style="font-family: 宋体; color: #333333;">目录下</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">BlogController.cs</span></p>
<p><span style="font-family: 宋体; color: #333333;">在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Models</span><span style="font-family: 宋体; color: #333333;">目录下</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRespository.cs</span></p>
<p><span style="font-family: 宋体; color: #333333;">在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Models</span><span style="font-family: 宋体; color: #333333;">目录下</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Post.cs</span></p>
<p><span style="font-family: 宋体; color: #333333;">在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">MvcApplicationTest</span><span style="font-family: 宋体; color: #333333;">项目下</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">BlogControllerTests</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">完成后，我的项目文件树像这样：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/3.jpg" width="316" border="0" height="554" /><br />
</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333; font-size: 14pt;">现在我想写足够多的代码让我们可以写一个测试。首先，我定义了容器接口。</span></p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/darkdawn/MVC/StructureMap/4.jpg" width="502" height="262" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">对真正的博客帖子容器来说这点内容是不够的，但是这里只是做一个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">demo</span><span style="font-family: 宋体; color: #333333;">而已。当你准备好写一个很强悍的</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">blog</span><span style="font-family: 宋体; color: #333333;">引擎的时候，你可以添加更多的方法。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">现在我仍然不管</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Post</span><span style="font-family: 宋体; color: #333333;">类，让它继续空着，可以以后再来实现。先实现</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">blog</span><span style="font-family: 宋体; color: #333333;">的</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">。</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/5.jpg" width="695" border="0" height="291" /><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;"><br />
<br />
</span></p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">好了，在这里打住。我们已经能够开始写单元测试了。毕竟我准备演示</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">TDD</span><span style="font-family: 宋体; color: #333333;">嘛。让我们先来写个测试。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Let&#8217;s Get Test Started, In Here.</span></strong><span style="font-family: 宋体; color: #333333;">（向黑眼豆豆致歉）</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">从最简单的测试开始，确定</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Recent</span><span style="font-family: 宋体; color: #333333;">这个行为（</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Action</span><span style="font-family: 宋体; color: #333333;">）没有指定视图（</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">View</span><span style="font-family: 宋体; color: #333333;">），因为我看到默认行为的运行结果。（这段代码假设你已经引用了所有需要的名称空间）</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/6.jpg" width="802" border="0" height="446" /></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333; font-size: 14pt;">运行这个测试，会失败。</span></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/7.jpg" width="819" border="0" height="244" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">但这正是我们所期望的，因为我们并没有实现</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Recent</span><span style="font-family: 宋体; color: #333333;">方法。这是</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">TDD</span><span style="font-family: 宋体; color: #333333;">红绿重构韵律之红色部分。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">还是让我们来把这个方法实现了吧：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/8.jpg" width="701" border="0" height="300" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">注意：我们是把精力集中在行为上，而不是在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">UI</span><span style="font-family: 宋体; color: #333333;">上。这和使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ASP.NET WebForms</span><span style="font-family: 宋体; color: #333333;">是不同的。这两者没有孰优孰劣，只是风格不同而已。</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;"><br />
<br />
</span></p>
<p><span style="font-family: 宋体; color: #333333;">现在当我运行测试，会通过。</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/9.jpg" width="626" border="0" height="256" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">很好，现在是</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">TDD</span><span style="font-family: 宋体; color: #333333;">生命周期的绿色部分了！也只个非常非常简单的</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">TDD</span><span style="font-family: 宋体; color: #333333;">例子。现在该我们进入介绍依赖注入阶段了。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">It&#8217;s Refactor Time</span></strong><span style="font-family: 宋体; color: #333333;">（向读者致歉，扯得太远了）</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">为了获得最近的博客帖子，我想为我的博客</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">提供一个&#8220;服务&#8221;实例，它可以请求这些帖子。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">这时，我不能确定我怎么去存储博客帖子，用什么好呢？</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">SQL?XML?</span><span style="font-family: 宋体; color: #333333;">还是其他？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">都不是。暂时不要去想它吧。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">我们可以把这个讨论延迟到最后的时刻。现在我要创建一个抽象容器</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRepository</span><span style="font-family: 宋体; color: #333333;">，用来描述我想怎么存储和取回这些博客帖子。我们来为</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">blogController</span><span style="font-family: 宋体; color: #333333;">写些代码，让它可以在它的构造器中接受一个这个接口的实例。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">这是依赖注入的依赖（</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Dependency</span><span style="font-family: 宋体; color: #333333;">）部分。这个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">现在有一个对</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostResitory</span><span style="font-family: 宋体; color: #333333;">的依赖。<img id="12" anchorname="OLE_LINK4" src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Images/anchor.gif" alt="" />注入（</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Injection</span><span style="font-family: 宋体; color: #333333;">）部分是一种机制：传递依赖给所需要依赖的类，直接创建类的实例，并绑定类到所指定的接口的实现。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">现在修改</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">BlogController</span><span style="font-family: 宋体; color: #333333;">类。</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/10.jpg" width="713" border="0" height="437" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">很好。注意我并没有改变</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Recent</span><span style="font-family: 宋体; color: #333333;">方法。我需要先写另一个测试，要确保它传递正确的数据给</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">view</span><span style="font-family: 宋体; color: #333333;">。</span></p>
<p>&nbsp;</p>
<p><em><span style="font-family: 宋体; color: #333333;">注意：你现在会发现刚才我们写的测试不能通过，先注释掉，我们一会再修正它。</span></em></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">我们现在要使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">mock</span><span style="font-family: 宋体; color: #333333;">框架，在我写测试之前，我需要引用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Moq.dll</span><span style="font-family: 宋体; color: #333333;">到我的测试项目中，在这里下载</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;"><a href="http://code.google.com/p/moq/downloads/list">MoQ</a></span><span style="font-family: 宋体; color: #333333;">。</span></p>
<p>&nbsp;</p>
<p><em><span style="font-family: 宋体; color: #333333;">注意：在本示例项目中已经引用了这个程序集。</span></em></p>
</span>
<p><em></em></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/11.jpg" width="741" border="0" height="372" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">这个测试动态创建</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRepository</span><span style="font-family: 宋体; color: #333333;">接口的实现。我们告诉它：不管是什么参数传递给了</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ListRecentPosts</span><span style="font-family: 宋体; color: #333333;">，返回两篇帖子。</span></p>
<p>&nbsp;</p>
<p><em><span style="font-family: 宋体; color: #333333;">注意：我们现在不需要这个接口的实现。我们感兴趣的是把测试</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Action</span><span style="font-family: 宋体; color: #333333;">的逻辑孤立出来，所以在测试的时候我们直接使用了接口实例化。</span></em></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">开始测试，失败了，看来我们需要重构</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Recent</span><span style="font-family: 宋体; color: #333333;">方法，让它正确运行：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/12.jpg" width="557" border="0" height="454" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">重新测试一次，成功了！</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Inject That Dependency</span></strong></p>
<p><span style="font-family: 宋体; color: #333333;">当我使用浏览器尝试访问这个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">action</span><span style="font-family: 宋体; color: #333333;">的时候（如</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">http://localhost:14963/Blog/Recent</span><span style="font-family: 宋体; color: #333333;">），会出现如下的错误页面：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/13.jpg" width="531" border="0" height="439" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">出现这样的错误很正常，默认情况下，</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ASP.NET MVC</span><span style="font-family: 宋体; color: #333333;">需要</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">有一个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">public</span><span style="font-family: 宋体; color: #333333;">的、无参的构造器，让它自己可以创建</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">的实例。但是我们的构造器需要一个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRepository</span><span style="font-family: 宋体; color: #333333;">实例作为参数。我们需要给</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">传递一个这样的参数才行。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap(</span><span style="font-family: 宋体; color: #333333;">或其他依赖注入框架</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">)</span><span style="font-family: 宋体; color: #333333;">来救援！</span></strong></p>
<p><em><span style="font-family: 宋体; color: #333333;">注意：记得下载和引用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap.dll</span><span style="font-family: 宋体; color: #333333;">程序集。我在示例代码中已经引用了。</span></em><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;"><br />
<br />
</span></p>
<p><span style="font-family: 宋体; color: #333333;">首先要在应用程序根目录下创建</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap.config</span><span style="font-family: 宋体; color: #333333;">文件，文件内容：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/14.jpg" width="515" border="0" height="494" /></p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">这里不对这个文件内容做详细解释，如果你想了解更多，请查看</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap</span><span style="font-family: 宋体; color: #333333;">文档。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">它只暴露了你所需要知道的最少细节，每个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">PluginFamily</span><span style="font-family: 宋体; color: #333333;">节点描述一个接口类型和一个节点的键（</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">key</span><span style="font-family: 宋体; color: #333333;">）。</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Plugin</span><span style="font-family: 宋体; color: #333333;">节点描述一个具体的类型：框架实例化接口类型需要创建的具体类型。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">比如说，第二个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">PluginFamily</span><span style="font-family: 宋体; color: #333333;">节点中，接口类型是</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRepository</span><span style="font-family: 宋体; color: #333333;">，具体的类型是</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">InMemoryPostRepository</span><span style="font-family: 宋体; color: #333333;">。当我们使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap</span><span style="font-family: 宋体; color: #333333;">构造一个包含对</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IPostRepository</span><span style="font-family: 宋体; color: #333333;">依赖的类型的实例时，</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap</span><span style="font-family: 宋体; color: #333333;">会传递一个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">InMemoryPostReposity</span><span style="font-family: 宋体; color: #333333;">实例。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">平时我使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">SqlPostRepository</span><span style="font-family: 宋体; color: #333333;">。但是这个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">demo</span><span style="font-family: 宋体; color: #333333;">的目的并不需要那么做，所以我打算用个静态集合，把存储这些博客帖子到内存中。我们总是可以不急着实现使用</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">SQL</span><span style="font-family: 宋体; color: #333333;">版本。</span></p>
<p>&nbsp;</p>
<p><em><span style="font-family: 宋体; color: #333333;">注意：本来应该写一个</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">InMemoryPostRepository</span><span style="font-family: 宋体; color: #333333;">的测试，但是这篇文章已经够长了。不过也别担心，我会把单元测试放到示例代码中去。</span></em></p>
</span>
<p><em></em></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/15.jpg" width="813" border="0" height="600" /></p>
<p>&nbsp;</p>
<p><strong></strong></p>
<span style="font-size: 14pt;">
<p><strong><span style="font-family: 宋体; color: #333333;">快，我们需要一个工厂!</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">快完成了。我们需要实现</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">IControllerFactory</span><span style="font-family: 宋体; color: #333333;">接口，把</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">StructureMap</span><span style="font-family: 宋体; color: #333333;">连接到</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">ASP.NET MVC</span><span style="font-family: 宋体; color: #333333;">上。</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">工厂的职责是创建</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Controller</span><span style="font-family: 宋体; color: #333333;">的实例。我们可以在自己的工厂中用这些逻辑：</span></p>
</span>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/16.jpg" width="888" border="0" height="440" /></p>
<p>&nbsp;</p>
<p style="font-size: 14pt;"><span style="font-family: 宋体; color: #333333;">最后，我们吧他们都连接起来，在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Global.asax.cs</span><span style="font-family: 宋体; color: #333333;">中的</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">Application_Start</span><span style="font-family: 宋体; color: #333333;">方法添加方法调用：</span></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/17.jpg" width="830" border="0" height="610" /></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333; font-size: 14pt;">一切搞定！现在我们把依赖注入框架引入到了我们的程序中，我们可以重新访问站点测试一下了（别忘记编译）。我们得到这个页面：</span></p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/StructureMap/18.jpg" width="518" border="0" height="444" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<span style="font-size: 14pt;">
<p><span style="font-family: 宋体; color: #333333;">很好很强大！黄屏去死吧，不过在这里是个好现象：我们的依赖对象已经注入到对象中了，这是另一个错误提示，因为我们没有</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">view</span><span style="font-family: 宋体; color: #333333;">创建</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">view</span><span style="font-family: 宋体; color: #333333;">造成的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">不好意思，跑题了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">这里我就不做了，你们可以自己做一个，或者你们可以在傻瓜示例源代码中看到。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">这个示例有点简单得可笑，不过这种原则在做更大的项目中也是通用的。它只是用来学习技术的，希望在你在</span><span style="font-family: &quot;Trebuchet MS&quot;,&quot;sans-serif&quot;; color: #333333;">TDD</span><span style="font-family: 宋体; color: #333333;">路上走得更好。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: #333333;">本文所有内容的<a href="http://haacked.com/code/TddDependencyInjectionDemo.zip">源代码下载</a>(ASP.NET MVC Preview 5/StructureMap 2.0)。</span></p>
</span>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/darkdawn/aggbug/1283692.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43624/" target="_blank">[新闻]诺基亚将支持Lotus Notes 和黑莓争夺市场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC Preview 4 源代码学习笔记 FilterAttribute</title><link>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1247022.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Sun, 20 Jul 2008 06:11:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1247022.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1247022.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1247022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1247022.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1247022.html</trackback:ping><description><![CDATA[<p>不废话，从FilterAttribute开始：</p>
<p>&nbsp;</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MvcSource/3-1.jpg" /></p>
<p>&nbsp;</p>
<p>&nbsp;抽象类FilterAttribute的是整个基础，Membership验证AuthorizeAttribute和ActionFilterAttribute继承它。<br />
</p>
<p>AuthorizeAttribute实现IAuthorizationFilter接口：<br />
</p>
<p>void OnAuthorization(AuthorizationContext filterContext);</p>
<p>AuthorizeAttribute的实现：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[AttributeUsage(AttributeTargets.Class&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;AttributeTargets.Method,&nbsp;Inherited&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,&nbsp;AllowMultiple&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand,&nbsp;Level&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AspNetHostingPermissionLevel.Minimal)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sealed</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AuthorizeAttribute&nbsp;:&nbsp;FilterAttribute,&nbsp;IAuthorizationFilter&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;_roles;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;_users;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Roles&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_roles&nbsp;</span><span style="color: #000000;">??</span><span style="color: #000000;">&nbsp;String.Empty;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_roles&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Users&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_users&nbsp;</span><span style="color: #000000;">??</span><span style="color: #000000;">&nbsp;String.Empty;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_users&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;OnAuthorization(AuthorizationContext&nbsp;filterContext)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(filterContext&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArgumentNullException(</span><span style="color: #800000;">"</span><span style="color: #800000;">filterContext</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPrincipal&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;filterContext.HttpContext.User;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">user.Identity.IsAuthenticated)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Cancel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpUnauthorizedResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">String.IsNullOrEmpty(Users))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;validNames&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SplitString(Users);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;wasMatch&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;validNames.Any(name&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;String.Equals(name,&nbsp;user.Identity.Name,&nbsp;StringComparison.OrdinalIgnoreCase));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">wasMatch)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Cancel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpUnauthorizedResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">String.IsNullOrEmpty(Roles))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;validRoles&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SplitString(Roles);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;wasMatch&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;validRoles.Any(role&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;user.IsInRole(role));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">wasMatch)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Cancel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.Result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpUnauthorizedResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;SplitString(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;original)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;from&nbsp;piece&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;original.Split(</span><span style="color: #800000;">'</span><span style="color: #800000;">,</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;trimmed&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;piece.Trim()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">String.IsNullOrEmpty(trimmed)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;trimmed;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p> </p>
<p>首先这个类是sealed的，要实现其他的用户验证，不能直接继承重写。<br />
</p>
<p><span style="color: #000000;">OnAuthorization方法依次验证</span>用户是否登录，如果有users参数或者roles参数，也会一一验证用户是否匹配。<br />
</p>
<p><br />
</p>
<p>ActionFilterAttribute 以前在preview、preview 2、3里，也可以写用户验证，重写ActionFilterAttribute 实现的 IActionFilter 接口成员 OnActionExecuting 即可。但是在Preview 4中，要写自己的用户验证，应该实现IAuthorizationFilter接口成员。</p><img src ="http://www.cnblogs.com/darkdawn/aggbug/1247022.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43623/" target="_blank">[新闻]Mozilla公布去年收入报告</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC Preview 4 学习笔记 Membership Authorization</title><link>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1246870.html</link><dc:creator>郁闷的翩翩</dc:creator><author>郁闷的翩翩</author><pubDate>Sat, 19 Jul 2008 16:15:00 GMT</pubDate><guid>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1246870.html</guid><wfw:comment>http://www.cnblogs.com/darkdawn/comments/1246870.html</wfw:comment><comments>http://www.cnblogs.com/darkdawn/archive/2008/07/20/1246870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/darkdawn/comments/commentRss/1246870.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/darkdawn/services/trackbacks/1246870.html</trackback:ping><description><![CDATA[<p>本来想写Preview 3中使用Membership的，结果Preview 4
已经集成了，真郁闷。就随便写写吧<img src="http://www.cnblogs.com/Emoticons/qface/055243623.gif" alt="" />。</p>
<p>&nbsp;<br />
</p>
<p>Membership的好处和不足在这里就不多说了。在中小项目中，使用它还是非常方便的。</p>
<p>不废话，首先运行Visual Studio 2008 Command Prompt：</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/Membership/2-1.jpg" /></p>
<p>输入aspnet_regsql <br />
</p>
<p>
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/Membership/2-2.jpg" width="565" height="97" /></p>
<p>然后根据向导：<br />
</p>
<p>&nbsp;<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/Membership/2-3.jpg" width="601" border="0" height="435" /></p>
<p>选择数据库：<br />
</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/Membership/2-4.jpg" width="602" border="0" height="441" />&nbsp;</p>
<p>然后一路下一步，完成向导，这时候数据库中就已经有了Membership所需要的表、视图和存储过程。<br />
</p>
<p>&nbsp;</p>
<p>记得修改web.config文件。用这个数据库的ConnectionString代替默认的SqlExpress的。就可以正常使用了。<br />
</p>
<p>&nbsp;</p>
<p>ASP.NET MVC PREVIEW4把Membership的使用已经集成了，并且做了默认的Controller和Views：</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/darkdawn/MVC/Membership/2-5.jpg" width="313" border="0" height="506" /></p>
<p>&nbsp;</p>
<p>首先看看注册用户部分的代码：</p>
<br />
<p> </p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ActionResult&nbsp;Register(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;username,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;email,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;password,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;confirmPassword)<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewData[</span><span style="color: #800000;">"</span><span style="color: #800000;">Title</span><span style="color: #800000;">"</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Register</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewData[</span><span style="color: #800000;">"</span><span style="color: #800000;">PasswordLength</span><span style="color: #800000;">"</span><span