<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="en-US"><title>Tim Weaver</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/default.aspx" /><tagline type="text/html">A .NET Blog</tagline><id>http://dotnetjunkies.com/WebLog/tim.weaver/default.aspx</id><author><url>http://dotnetjunkies.com/WebLog/tim.weaver/default.aspx</url></author><generator url="http://communityserver.org" version="1.0.1.50214">Community Server</generator><modified>2005-05-04T03:47:00Z</modified><entry><title>What to give the guy who has everything [OT]</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/10/23/133384.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:133384</id><created>2005-10-23T14:43:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;My&amp;nbsp;answer is &lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/10/23/169.aspx"&gt;here&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=133384" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Using Close Dispose and Finalize</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/07/17/131338.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:131338</id><created>2005-07-17T14:22:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;Check out my latest article on Finalizers, IDisposable, Close and the Using Statement&lt;/P&gt;
&lt;P&gt;&lt;A href="http://codeverity.com/blogs/tim_weaver/articles/UsingCloseDisposeAndFinalize.aspx"&gt;Here&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=131338" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Stopping Comment Spam Iteration 2 Continued</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/16/125157.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:125157</id><created>2005-06-16T20:28:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;I've posted the code changes that resulted from our comment spam module iteration two&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#0000ff&gt;&lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/16/23.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/16/23.aspx&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;A href="http://www.codeverity.com/blog/tim_weaver"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=125157" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Search Engines Finding My New Site</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/15/123994.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:123994</id><created>2005-06-15T18:34:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;Read it here &lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/15/21.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/15/21.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Or just read below for the summary&lt;/P&gt;
&lt;P&gt;YahooSearch rules&lt;/P&gt;
&lt;P&gt;....&lt;/P&gt;
&lt;P&gt;Google and MSN get a big goose egg&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=123994" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Assembly Manifest Breaking Change in Whidbey</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/15/123992.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:123992</id><created>2005-06-15T18:22:00Z</created><content type="text/html" mode="escaped">Read it here &lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/15/19.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/15/19.aspx&lt;/A&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=123992" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Creating an HttpModule to Stop Comment Spam -- Iteration Two</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/14/121299.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:121299</id><created>2005-06-14T18:25:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;Continuing my comment spam HttpModule posts I've put up iteration two. Next will be the code that results from this iteration. [ First I have to go write it though]&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#800080&gt;&lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/14/17.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/14/17.aspx&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;A href="http://codeverity.com/blogs/tim_weaver/"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=121299" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Creating a HttpModule to Stop Comment Spam - Iteration One</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/14/121262.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:121262</id><created>2005-06-14T07:24:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;Read it here&lt;/P&gt;
&lt;P&gt;&lt;A href="http://codeverity.com/admin/blogs/posteditor.aspx?App=tim_weaver&amp;amp;PostID=10"&gt;http://codeverity.com/admin/blogs/posteditor.aspx?App=tim_weaver&amp;amp;PostID=10&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=121262" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Creating an HttpModule to Stop Comment Spam</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/12/121048.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:121048</id><created>2005-06-12T18:51:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;I've begun a new series of posts on creating an HttpModule directed towards stopping unwanted comment spam.&lt;/P&gt;
&lt;P&gt;Initial Post:&amp;nbsp; &lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/13/5.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/13/5.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Design:&amp;nbsp; &lt;A href="http://codeverity.com/blogs/tim_weaver/archive/2005/06/13/6.aspx"&gt;http://codeverity.com/blogs/tim_weaver/archive/2005/06/13/6.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=121048" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Moving blog to new host</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/12/121047.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:121047</id><created>2005-06-12T18:50:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;I've decided I can't wait any longer on the spam fix. DNJ has been great and I'll probably continue to direct posts from here to my new blog for the near future.&lt;/P&gt;
&lt;P&gt;I've setup Community Server RC3 and have begun posting on the new site. It's likely to be a little iffy until I can iron out any issues that might come up.&lt;/P&gt;
&lt;P&gt;Check it out here:&lt;/P&gt;
&lt;P&gt;&lt;a href="http://codeverity.com/blogs/tim_weaver"&gt;CodeVerity&lt;/a&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://codeverity.com/blogs/MainFeed.aspx?GroupID=3"&gt;RSS&lt;/A&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=121047" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Dev Partner Security Checker Team is looking for you</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/06/06/111163.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:111163</id><created>2005-06-06T03:22:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;The Security Checker team is currently looking to add an additional member to the team. Think you got what it takes to create cutting edge tools for developers?&lt;/P&gt;
&lt;P&gt;Interested in learning more? Contact Ryan.Kramer [AT] compuware.com with your resume or feel free to contact me via this blog if you want more info.&lt;/P&gt;
&lt;P&gt;Complete&amp;nbsp;Job posting:&amp;nbsp;&amp;nbsp; &lt;A href="http://www.compuware.com/careers/search/posting.asp?index=33003&amp;amp;jobNum=T15619102"&gt;http://www.compuware.com/careers/search/posting.asp?index=33003&amp;amp;jobNum=T15619102&lt;/A&gt;&lt;/P&gt;
&lt;H3&gt;Job Description&lt;/H3&gt;
&lt;P&gt;Join the people that build software for business applications. Compuware's Product Development Centers allow you to be an integral part of developing award-winning software. &lt;BR&gt;&lt;BR&gt;A critical member of the DevPartner development team, responsible for creating state-of-the-art, award-winning products, specifically in the ASP.NET space. &lt;BR&gt;&lt;BR&gt;Primary Roles/Responsibilities: &lt;BR&gt;&lt;BR&gt;* Translate requirements into software design. &lt;BR&gt;* Design components and/or products to satisfy requirements. &lt;BR&gt;* Work closely with the Architecture team to ensure product design is inline with overall architectural vision. &lt;BR&gt;* Implement, unit test and integrate components into a stable, highly usable product. &lt;BR&gt;* Conduct training sessions for QA, Support and Sales on all aspects of the product. &lt;BR&gt;* Work with the Release Engineering team to define the product installation requirements. &lt;BR&gt;* Work with the Human Factors / User Interaction team on all user visible aspects of the product. &lt;BR&gt;* Document software engineering processes. Mentor teammates in understanding the total product architecture, suggesting improvements and providing strategies for problem resolution. &lt;BR&gt;* Work with Support and QA on customer issues. &lt;BR&gt;* Meet deadlines without sacrificing quality goals. &lt;BR&gt;* Take an active role in and support process improvement initiatives and follow all company policies and procedures. &lt;BR&gt;&lt;BR&gt;Required Skills/Competencies: &lt;BR&gt;&lt;BR&gt;* Extensive experience with writing medium to large ASP.NET applications with C# and Visual Studio.NET 2003. &lt;BR&gt;* In-depth understanding of HTTP, proxies, .NET code access security and various authentication mechanisms. &lt;BR&gt;* Strong understanding of the .NET Framework, use of multiple AppDomains, multithreading, P/Invoke and COM. &lt;BR&gt;* Bachelor's degree in Computer Science / Engineering, or higher. &lt;BR&gt;* Strong technical background in .NET, ASP.NET, C#, WinForms and COM. &lt;BR&gt;* In-depth knowledge of software development techniques. &lt;BR&gt;* Strong analytical / troubleshooting skills. &lt;BR&gt;* Team player. Ability to work effectively within a diverse team and with other functional teams. &lt;BR&gt;* Excellent verbal, written and presentation communication skills. &lt;BR&gt;* Strong organizational / time management skills. &lt;BR&gt;* Ability to accurately estimate software size and effort required. &lt;BR&gt;&lt;BR&gt;Desired Skills/Competencies: &lt;BR&gt;&lt;BR&gt;* Experience with the DevPartner family of products. &lt;BR&gt;* Experience with web security assessment and validation products &lt;BR&gt;* Experience with C/C++, VB.NET, XML, XSLT, ChangePoint, VMWare and Perforce. &lt;BR&gt;* Experience with beta versions of Visual Studio. &lt;BR&gt;* Familiarity with Capability Maturity Model (CMM) and / or Capability Maturity Model Integration (CMMI). &lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=111163" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>NH .NET User Group Tonight  - May 19th</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/19/83316.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:83316</id><created>2005-05-19T03:25:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;&lt;B&gt;This month at New Hampshire Dot Net
&lt;P&gt;&lt;/P&gt;&lt;/B&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Thursday May 19&lt;SUP&gt;th&lt;/SUP&gt; BU Corp Education Center Tyngsboro, MA 6 PM&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.bostonusergroups.net/RssFeed/6000.vcs"&gt;vCalendar&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;This month is the first of a three part series on &lt;A href="http://msdn.microsoft.com/webservices/understanding/default.aspx" target=_blank&gt;Web Services&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/webservices/building/wse/default.aspx" target=_blank&gt;Web Services Enhancements (WSE)&lt;/A&gt; and&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;A href="http://msdn.microsoft.com/architecture/soa/default.aspx" target=_blank&gt;Service Oriented Architecture (SOA).&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;In coming months, we&amp;#8217;ll be hearing from &lt;A href="http://www.reliablesoftware.com/presentations.html#SOA" target=_blank&gt;Michael Stiefel on SOA&lt;/A&gt; and &lt;A href="http://www.thedatafarm.com/talks.aspx" target=_blank&gt;Julia Lerman on WSE 2.0&lt;/A&gt; (if we can entice her to come down from Burlington VT)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;This week Phil Denoncourt will be getting us started on WSE 2.0 and Pat Tormey will attempt to introduce you to SOA.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;There will be an opportunity for attendees to share their lessons learned from getting hands on with Web Services.. So bring along your war stores.. show us the battle scars&amp;#8230;&lt;/P&gt;
&lt;P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=83316" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Why do companies buy SAP R3</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/05/73624.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:73624</id><created>2005-05-05T17:38:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;I just got my weekly issue of (fill in your weekly computer rag) and under the news section is &amp;#8220;Difficult ERP Rollout Slows Furniture Maker&amp;#8221;. Is it just me or does this seem like the norm with SAP R/3 rollouts?&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;Let's see there was&lt;/FONT&gt;&lt;BR&gt;The City of San Antonio&lt;BR&gt;Rowe Furniture&lt;BR&gt;Dell Computer&lt;BR&gt;That whole UK fiasco with EDS ( I pretty sure that was SAP R/3 )&lt;/P&gt;
&lt;P&gt;So my question is who is buying this crap and why do companies continue to try and roll it out when there is one high profile, expensive, failure after another?&lt;/P&gt;
&lt;P&gt;Dell Computer tried to use SAP to replace its DOMs (Dell Order Management System). This was many years ago and the price tag that I recall was around 14 million dollars. For what? Not a single Dell employee was using SAP when I worked there. In fact Dell tried to replace DOMs so many times it became something of a joke [but that's another post]. It is always amusing to watch a company squirm because their entire backend system is running on a competitors hardware (Tandem).&lt;/P&gt;
&lt;P&gt;Has anyone worked on a SAP R/3 rollout that wasn't a death march? I really want to know. Five or six years ago I was&amp;nbsp;seriously considering jumping to the SAP platform because the developers were making gobs of money. These days you couldn't pay me to work on a SAP rollout. I'm both older and smarter. Who wants to work on something doomed to fail?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=73624" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Team System - Team Test</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/05/73603.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:73603</id><created>2005-05-05T11:16:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;I've been spending a lot of quality time with Team System creating, running, and cursing web tests and load tests. Don't get me wrong here, the product is a lot better than trying to write load tests in ACT, but it falls short in a number of places. It's still beta so hopefully these things will be addressed before RTM.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080 size=4&gt;My Current List of Issues&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;No way to share test context between tests -- I want to be able to create a test called LogIn that only logs a user in. Then I want to create a test that is ModifyAccount that only modifies the user account. The ModifyAccount test depends on the user being logged in so I want to be able to point it to LogIn and have that context (cookies, etc) pass through. Otherwise I have to duplicate the LogIn code in each and every test that requires a user be authenticated. That sucks!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#000080 size=4&gt;Memory Usage&lt;/FONT&gt; -- I'm running with 1Gig of RAM and the default selection of counters causes the test to fail due to lack of memory in minutes. In fact I had to close everything down and remove well over 50% of the counters in order to get a test to run for more than a few minutes. On top of that if I used SQLExpress to store the results it's memory usage would grow as long as the test was running (which would only be about 5 minutes) and again it would shut down. I had to change to Xml storage to get a test to run for any length of time.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#000080 size=4&gt;DataSources&lt;/FONT&gt; -- The whole datasource concept needs some work. Once you setup a datasource there is no way to change it. For example I changed a table name. The datasource contains the table names and doesn't allow you to change them once it is created. In fact the entire database could be missing, but the datasource will happily act as if it is available. Another issue I ran into was the fact that I had two tables, one of which was empty [no rows] and the other had data. My webtest was bound to the table with data however the test refused to run because it said that it was bound to a table with no rows [which it wasn't using]. Since I can't modify the tables I had to insert a dummy record into the empty table in order to get the test to run. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#000080 size=4&gt;Graph View&lt;/FONT&gt; -- The graph view of the performance counters is nice, but the decision to vary the scale dynamically seems like a poor one especially from a Human Factors point of view. Now, when looking at a running test, or test results, I can't compare the lines I have to mentally do the coversion to make sure everything has the same scale. Also I noticed if you add two counters that are similar but vary only by page name only the first counter will be added to the graph. Evidently the graph decides the counter is already there so it doesn't show it again.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#000080 size=4&gt;Location of Results&lt;/FONT&gt; -- One of the issues I'm having is that I'm running out of space on my C drive. The XmlResults files are placed in C and I couldn't find a dialog that would allow me to move them somewhere else. This is a real problem because the test will shut down if you run out of space. I should be able to have these files live anywhere, not just under some folder in Documents and Settings&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080 size=4&gt;Test Settings&lt;/FONT&gt; -- Another more general complaint is that after you have created your load test and you decide you want to change some values (number of users, think time, whatever) it is no small feat to figure out where to go. There are many items in the load test tree and except for a few of the more obvious ones finding a specific entry/value is a hassle. The opening wizard is nice, so about a single click relaunch of the wizard to keep it that way?&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=73603" width="1" height="1"&gt;</content><slash:comments>3</slash:comments></entry><entry><title>Dependency Injection</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/05/73596.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:73596</id><created>2005-05-05T10:10:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #fffbf0"&gt;A couple of replies to my recent posts on &lt;A href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/04/28/72140.aspx"&gt;ASP.NET Context&lt;/A&gt; and using the &lt;A href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/04/73072.aspx"&gt;Strategy pattern&lt;/A&gt; have really got me thinking about one of the design guidelines I've been following. &lt;A href="http://agitek.co.uk/"&gt;Tim Haughton&lt;/A&gt;&amp;nbsp;posted an example of the strategy pattern and &lt;A id=Comments.ascx_CommentList__ctl1_NameLink target=_blank&gt;Michael Polo&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;posted that I should consider NMock to handle my ASP.NET&amp;nbsp;Context testing.&lt;/P&gt;
&lt;P&gt;Now in the past I have looked at NMock and for a lot of things it makes great sense, but it tends to be a lot of work and the benefit to work ratio isn't necessarily positive (in my past experience). So I have not gone down that route.&lt;/P&gt;
&lt;P&gt;Both Tim Haughton and Michael Polo either directly or indirectly were saying use Dependency Injection to handle these issues (which is what NMock does). In the past I've always considered writing my code so that it can be tested to be less than ideal. In fact if I had to write an interface specifically for a unit test and for no other reason I wouldn't do it because it just didn't &amp;#8220;feel&amp;#8221; right.&lt;/P&gt;
&lt;P&gt;I've mostly decided that I was wrong. The extra effort to design for depenedency injection scenarios, especially in code that is hard to test, [e.g. ASP.NET Context] is not only smart, in the end it would be more efficient. It is far more important to have code that is testable than to have some obscure purity of design.&lt;/P&gt;
&lt;P&gt;So thanks Tim and Michael for helping me see beyond the blinders I had put on!&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=73596" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Strategy Pattern</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/tim.weaver/archive/2005/05/04/73072.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:73072</id><created>2005-05-04T03:47:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;How many times have you read something along the lines of "replace switch statement with strategy pattern"? &lt;/P&gt;
&lt;P&gt;I've read it a lot and to be honest I never really "got it". I've read a number of patterns books and looked at numerous examples but they always left me wondering how that gets rid of the switch. After all, I thought, you still have to make a determination on what gets called...&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080 size=4&gt;It's all about the Pattern&lt;/FONT&gt;&lt;BR&gt;I decided to end my ignorance. It turns out that the problem was with how I was interpreting the pattern. I kept thinking that you would still have to use a switch/if then else or something to figure out what to call, but that simply isn't true. Using the Strategy pattern you move that decision step back up the call stack [I'll probably get smacked around for that statement, but it fits my mental picture]. &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080 size=4&gt;How about an Example&lt;/FONT&gt;&lt;BR&gt;In order to have this make sense I created a non trivial example. In it we have a class RequestHandlerOriginal that has a single method ProcessUserRequest that takes in an enum value and a userID. Based upon the enum it will call out to the appropriate method. In the below example I left the calls to the Worker.* methods. There isn't really any good reason for this class to exist. In reality these methods could/should be folded into the strategy classes. This cuts down on the actual amount of code you have to maintain. Here's the original: [this is code I just tossed together. It compiles, but that is my only promise] &lt;/P&gt;
&lt;DIV 0pt;? padding-bottom: solid; 1pt windowtext border-bottom: 0pt; padding-right: border-right: padding-left: border-left: padding-top: border-top: #fffbf0; background: #000000; color: 10pt; font-size: New; Courier&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #008000;?&gt; The original implementation&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerOriginal&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; enum&lt;/SPAN&gt;&lt;SPAN&gt; ActionType&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Login,&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LogOut,&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ChangePassword,&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ResetPassword&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/SPAN&gt;&lt;SPAN&gt; Constructor&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerOriginal(){}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #008000;?&gt; Takes in the ActionType and the userID and then based upon the requested action it will&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #008000;?&gt; call the appropriate method&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;param name=3D"action"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;param name=3D"userID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest(ActionType action, &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;switch&lt;/SPAN&gt;&lt;SPAN&gt;(action)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;case&lt;/SPAN&gt;&lt;SPAN&gt; ActionType.Login:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessLoginRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;break&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;case&lt;/SPAN&gt;&lt;SPAN&gt; ActionType.LogOut:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessLogOutRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;break&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;case&lt;/SPAN&gt;&lt;SPAN&gt; ActionType.ChangePassword:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessChangePasswordRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;break&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;case&lt;/SPAN&gt;&lt;SPAN&gt; ActionType.ResetPassword:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessResetPasswordRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;break&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;default&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;throw&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; new&lt;/SPAN&gt;&lt;SPAN&gt; ArgumentOutOfRangeException("ActionType", action, "Unable to handle the requested action");&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;Now here is how it is called 
&lt;DIV 0pt;? padding-bottom: solid; 1pt windowtext border-bottom: 0pt; padding-right: border-right: padding-left: border-left: padding-top: border-top: #fffbf0; background: #000000; color: 10pt; font-size: New; Courier&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;96&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; CallOriginal()&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;97&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;98&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RequestHandlerOriginal orig =3D &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerOriginal();&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; orig.ProcessUserRequest(RequestHandlerOriginal.ActionType.ChangePassword, 11111);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;100&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;Here are the new class(s) based upon the Strategy Pattern 
&lt;DIV 0pt;? padding-bottom: solid; 1pt windowtext border-bottom: 0pt; padding-right: border-right: padding-left: border-left: padding-top: border-top: #fffbf0; background: #000000; color: 10pt; font-size: New; Courier&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/SPAN&gt;&lt;SPAN&gt; Strategy Base Class&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #008000;?&gt; This is the base class that all strategy participants inherit from&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #808080;?&gt;///&lt;/SPAN&gt;&lt;SPAN #808080;?&gt; &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; abstract&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerNew&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; abstract&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/SPAN&gt;&lt;SPAN&gt; Concrete Strategy classes&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerLogin:RequestHandlerNew&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; override&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessLoginRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerLogOut:RequestHandlerNew&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; override&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; ProcessUserRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessLogOutRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerChangePassword:RequestHandlerNew&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; override&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessChangePasswordRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerResetPassword:RequestHandlerNew&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; override&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessUserRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Workers.ProcessResetPasswordRequest(userID);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;Here is how to call the new class(s) 
&lt;DIV 0pt;? padding-bottom: solid; 1pt windowtext border-bottom: 0pt; padding-right: border-right: padding-left: border-left: padding-top: border-top: #fffbf0; background: #000000; color: 10pt; font-size: New; Courier&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; CallStrategy()&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RequestHandlerNew newHandler =3D &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; RequestHandlerChangePassword();&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; newHandler.ProcessUserRequest(11111);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;Here is the worker class (just so the code compiles as promised) 
&lt;DIV 0pt;? padding-bottom: solid; 1pt windowtext border-bottom: 0pt; padding-right: border-right: padding-left: border-left: padding-top: border-top: #fffbf0; background: #000000; color: 10pt; font-size: New; Courier&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; class&lt;/SPAN&gt;&lt;SPAN&gt; Workers&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;protected&lt;/SPAN&gt;&lt;SPAN&gt; Workers(){}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/SPAN&gt;&lt;SPAN&gt; worker methods&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; static&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessLoginRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID){ &lt;/SPAN&gt;&lt;SPAN #008000;?&gt;/*do something*/&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; static&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessLogOutRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID){ &lt;/SPAN&gt;&lt;SPAN #008000;?&gt;/*do something*/&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; static&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessChangePasswordRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID){ &lt;/SPAN&gt;&lt;SPAN #008000;?&gt;/*do something*/&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;public&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; static&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt; void&lt;/SPAN&gt;&lt;SPAN&gt; ProcessResetPasswordRequest(&lt;/SPAN&gt;&lt;SPAN #0000ff;?&gt;int&lt;/SPAN&gt;&lt;SPAN&gt; userID){ &lt;/SPAN&gt;&lt;SPAN #008000;?&gt;/*do something*/&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN #0000ff;?&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/SPAN&gt;&lt;/P&gt;
&lt;P 0px;?&gt;&lt;SPAN background: #fffbf0;? #008080;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT color=#000080 size=4&gt;Conclusion&lt;/FONT&gt;&lt;BR&gt;At the point of the CallOriginal() method call the developer had to make a decision about what action was being taken. The reason I say that is because the enum ActionType had to be set. Likewise with the Strategy pattern the decision about what is being called is made at the time of the call the difference is that it is explicit instead of implicit. The switch statement is no longer needed because we don't have the additional intermediate method.&lt;/P&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=73072" width="1" height="1"&gt;</content><slash:comments>1</slash:comments></entry></feed>