<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jesse Ezell Blog</title><link>http://weblogs.asp.net/jezell/default.aspx</link><description>&lt;i&gt;.NET and Other Interesting Stuff&lt;/i&gt;

&lt;div id="ad"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-1219444915196145";
/* 468x60, created 1/25/10 */
google_ad_slot = "1898962835";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/div&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Building Custom HTTP Help Pages with WCF</title><link>http://weblogs.asp.net/jezell/archive/2010/05/04/building-custom-http-help-pages-with-wcf.aspx</link><pubDate>Wed, 05 May 2010 00:44:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7470484</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=7470484</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2010/05/04/building-custom-http-help-pages-with-wcf.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Been asked this a few times and needed to figure it out myself, so I put together a post on how to host custom HTTP help pages for your WCF services:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blog.iserviceoriented.com/index.php/2010/05/04/building-custom-http-help-pages-with-wcf/"&gt;http://blog.iserviceoriented.com/index.php/2010/05/04/building-custom-http-help-pages-with-wcf/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;A little help from the WCF team to open up some of the internal classes would make it more straightforward... until them, it takes a bit of hacking and black magic.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7470484" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Angle Brackets Are Dead. Long Live XML.</title><link>http://weblogs.asp.net/jezell/archive/2010/02/07/angle-brackets-are-dead-long-live-xml.aspx</link><pubDate>Sun, 07 Feb 2010 21:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7338201</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=7338201</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2010/02/07/angle-brackets-are-dead-long-live-xml.aspx#comments</comments><description>Many people fail to realize that XML can be used to represent many formats beyond the standard text xml encoding that most people recognize. So, I wrote a little post about how WCF takes advantage of this idea to illustrate what is possible when you change the way you think about XML.

&lt;a href="http://blog.iserviceoriented.com/index.php/2010/02/07/angle-brackets-are-dead-long-live-xml/"&gt;http://blog.iserviceoriented.com/index.php/2010/02/07/angle-brackets-are-dead-long-live-xml/&lt;/a&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7338201" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/jezell/archive/tags/XML/default.aspx">XML</category></item><item><title>Neuron ESB on Endpoint.TV</title><link>http://weblogs.asp.net/jezell/archive/2010/01/25/neuron-esb-on-endpoint-tv.aspx</link><pubDate>Mon, 25 Jan 2010 22:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7323013</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=7323013</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2010/01/25/neuron-esb-on-endpoint-tv.aspx#comments</comments><description>&lt;p&gt;We recently sat down with Ron Jacobs to talk about Neuron ESB on Endpoint.TV.&lt;/p&gt;

&lt;a href="http://channel9.msdn.com/shows/Endpoint/endpointtv-WCF-Partner-Neuron-ESB/"&gt;http://channel9.msdn.com/shows/Endpoint/endpointtv-WCF-Partner-Neuron-ESB/&lt;/a&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7323013" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Neuron+ESB/default.aspx">Neuron ESB</category></item><item><title>Building a Simple Web Server With WCF</title><link>http://weblogs.asp.net/jezell/archive/2010/01/23/building-a-simple-web-server-with-wcf.aspx</link><pubDate>Sun, 24 Jan 2010 01:08:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7321119</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=7321119</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2010/01/23/building-a-simple-web-server-with-wcf.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Tired of seeing a million examples of using REST support in WCF (which blows) and not a single example that goes beyond the basics everyone knows. So, I wrote a simple web server today using WCF and blogged about it:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blog.iserviceoriented.com/index.php/2010/01/23/building-a-basic-web-server-using-wcf/"&gt;http://blog.iserviceoriented.com/index.php/2010/01/23/building-a-basic-web-server-using-wcf/&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7321119" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/jezell/archive/tags/REST/default.aspx">REST</category></item><item><title>Back in Action</title><link>http://weblogs.asp.net/jezell/archive/2010/01/22/back-in-action.aspx</link><pubDate>Fri, 22 Jan 2010 09:19:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7319511</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=7319511</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2010/01/22/back-in-action.aspx#comments</comments><description>&lt;p&gt;Everyone keeps asking me to start blogging again... so I'm finally doing it. I'm back in action after a year or so off from blogging. Been working with WCF 24/7 since joining the Neuron ESB Team and have plenty of WCF tricks to share.&lt;/p&gt;

&lt;p&gt;Anyway, kicking off things with an intro post about the WCF Message Class.&lt;/p&gt;

&lt;a href="http://blog.iserviceoriented.com/index.php/2010/01/22/message-the-most-important-class-in-wcf/"&gt;http://blog.iserviceoriented.com/index.php/2010/01/22/message-the-most-important-class-in-wcf/&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7319511" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category></item><item><title>ESB Series: Part 5</title><link>http://weblogs.asp.net/jezell/archive/2008/10/09/esb-series-part-5.aspx</link><pubDate>Thu, 09 Oct 2008 19:59:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6667529</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6667529</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/10/09/esb-series-part-5.aspx#comments</comments><description>Been a really crazy month with a lot of projects all going into production at once. Finally had some time to blog about the progress on my WCF based ESB:

&lt;a href="http://www.iserviceoriented.com/blog/post/Building+Our+Own+ESB+-+Publish+Subscribe+Part+5.aspx"&gt;http://www.iserviceoriented.com/blog/post/Building+Our+Own+ESB+-+Publish+Subscribe+Part+5.aspx&lt;/a&gt;

There's been a ton of interest in the project for something that is still very early on. Thanks to everyone who has provided feedback so far.&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6667529" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/jezell/archive/tags/ESB/default.aspx">ESB</category></item><item><title>Articulate '09 Product Launch</title><link>http://weblogs.asp.net/jezell/archive/2008/09/30/articulate-09-product-launch.aspx</link><pubDate>Tue, 30 Sep 2008 23:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6649303</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6649303</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/09/30/articulate-09-product-launch.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;&lt;A class="" href="http://weblogs.asp.net/controlpanel/blogs/www.articulate.com" mce_href="http://weblogs.asp.net/controlpanel/blogs/www.articulate.com"&gt;&lt;IMG src="http://www.articulate.com/images/products09/banner_studio.jpg" mce_src="http://www.articulate.com/images/products09/banner_studio.jpg"&gt;&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;The Articulate team has released its '09 product suite. Our team has grown quite a bit since our&amp;nbsp;last releases. Congrats to everyone!&lt;/P&gt;
&lt;P mce_keep="true"&gt;If you haven't seen Articulate's tools, check them out here:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.articulate.com/" mce_href="http://www.articulate.com/"&gt;http://www.articulate.com&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;We won a ton of awards with the last suite and this one blows the previous out of the water. Good times ahead.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6649303" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Articulate/default.aspx">Articulate</category></item><item><title>Configuring WCF Performance</title><link>http://weblogs.asp.net/jezell/archive/2008/09/09/configuring-wcf-performance.aspx</link><pubDate>Tue, 09 Sep 2008 16:36:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6613410</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6613410</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/09/09/configuring-wcf-performance.aspx#comments</comments><description>&lt;P&gt;Because the WCF team wanted to provide something secure out of the box and allow inexperienced developers to get up and running quickly, WCF will not perform well without tweaking. Here's a little help with the less obvious settings:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://www.iserviceoriented.com/blog/post/Configuring+Performance+Options+-+WCF+Gotcha+3.aspx"&gt;http://www.iserviceoriented.com/blog/post/Configuring+Performance+Options+-+WCF+Gotcha+3.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6613410" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category></item><item><title>ESB Series Part 4</title><link>http://weblogs.asp.net/jezell/archive/2008/09/01/esb-series-part-4.aspx</link><pubDate>Mon, 01 Sep 2008 21:57:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6589558</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6589558</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/09/01/esb-series-part-4.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Long awaited part 4 of my WCF based ESB series is up:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.iserviceoriented.com/blog/post/Building+Our+Own+ESB+-+Publish+Subscribe+Part+4.aspx"&gt;http://www.iserviceoriented.com/blog/post/Building+Our+Own+ESB+-+Publish+Subscribe+Part+4.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;Code is being hosted on GitHub now for anyone that wants to browse and get some ideas (link to the source is at the bottom of the post). The ESB framework&amp;nbsp;is coming along nicely.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6589558" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/jezell/archive/tags/ESB/default.aspx">ESB</category></item><item><title>Entity Framework: Right Problem, Wrong Place</title><link>http://weblogs.asp.net/jezell/archive/2008/08/28/entity-framework-right-problem-wrong-place.aspx</link><pubDate>Thu, 28 Aug 2008 14:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6574044</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6574044</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/08/28/entity-framework-right-problem-wrong-place.aspx#comments</comments><description>&lt;p&gt;I was listening to the recent .NET rocks episode about the Entity Framework advisory council and it was interesting to hear the team's point of view and the problems they are trying to solve with the Entity Framework. They have nice goals, but there is a fundamental problem here that some of the original database gurus like C.J. Date make quite clear. SQL is flawed. It's not that we need a million object relational mappers or that we need to look at our databases in terms of objects. In fact, that's the opposite of what the relational model was intended to do. When E.F. Codd invented the relational model, he intended for the database to be a collection of facts with relationships to other facts... not a collection of objects. The relational model was supposed to provide a way to look at and work with these facts in different ways, but SQL and modern RDBMS's fall short of what they were supposed to do. Somewhere along the way, the original plans were lost. Instead of building a truely relational storage system, vendors jumped on the semi-relational SQL model. The SQL model ties physical structure closely to the logical data model, which is where a lot of problems start coming into play. This leads to the situations we've all seen where we need to denormalize the data model to get decent performance numbers.&amp;nbsp; It seems to me that the solution to the problem should not start with mapping the data to objects, it should start inside SQL Server itself, transitioning from the flawed world of T-SQL to a true implementation of the relational model as it was intended, a world where the physical model is truely detatched from the logical model.&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6574044" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://weblogs.asp.net/jezell/archive/tags/SQL/default.aspx">SQL</category></item><item><title>HealthVault Uses XML Storage</title><link>http://weblogs.asp.net/jezell/archive/2008/07/29/healthvault-uses-xml-storage.aspx</link><pubDate>Tue, 29 Jul 2008 19:32:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6458014</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6458014</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/07/29/healthvault-uses-xml-storage.aspx#comments</comments><description>&lt;P&gt;Via EricGu:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;From the "perhaps this might be interesting" file...&lt;/P&gt;
&lt;P&gt;Since the end of the HealthVault Solution Providers confererence in early June - and the subsequent required recharging - I've been spending the bulk of my time working on HealthVault data types, along with one of the PMs on the partner team.&amp;nbsp;It interesting work - there's a little bit of schema design (all our data types are stored in XML on the server), a little bit of data architecture (is this one data type, or four?), a fair amount of domain-specific learning (how many ways are there to measure body fat percentage?), a bit of working directly with partners (exactly what is this type for?), a lot of word-smithing (should this element be "category", "type", or "area"?), and other things thrown in now and then (utility writing, class design, etc.). [1]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Definitely in the "interesting file." Please post more details :) I would love to hear more about this.&lt;/P&gt;
&lt;P&gt;[1] &lt;A href="http://blogs.msdn.com/ericgu/archive/2008/07/29/healthvault-data-type-design.aspx"&gt;http://blogs.msdn.com/ericgu/archive/2008/07/29/healthvault-data-type-design.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6458014" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://weblogs.asp.net/jezell/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/jezell/archive/tags/HealthVault/default.aspx">HealthVault</category></item><item><title>Agile Development: Warning Signs</title><link>http://weblogs.asp.net/jezell/archive/2008/07/29/agile-development-warning-signs.aspx</link><pubDate>Tue, 29 Jul 2008 19:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6458007</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6458007</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/07/29/agile-development-warning-signs.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Alok Srivastava has an excellent post discussing agile development and areas that can put agile projects at risk. I'm currently doing clean up on an agile project gone south, and I wholeheartedly agree that the issues he points out should be warning signs if you are considering agile development. That's not to say that agile is bad by any means, just that you should think&amp;nbsp;carefully before you make the jump, especially if your project will have the issues Alok mentions:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blogs.msdn.com/isv/archive/2008/07/29/agile-methodology-and-new-product-development-four-key-issues.aspx"&gt;http://blogs.msdn.com/isv/archive/2008/07/29/agile-methodology-and-new-product-development-four-key-issues.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6458007" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Agile+Development/default.aspx">Agile Development</category></item><item><title>Making the Possible More Impossible</title><link>http://weblogs.asp.net/jezell/archive/2008/07/27/making-the-possible-more-impossible.aspx</link><pubDate>Mon, 28 Jul 2008 01:42:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6452084</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6452084</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/07/27/making-the-possible-more-impossible.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;&lt;A class="" href="http://blogs.msdn.com/jaredpar/" mce_href="http://blogs.msdn.com/jaredpar/"&gt;Jared Parsons&lt;/A&gt; thought it would be nice if we could have a ReadOnlyList object in our generic template instead of IEnumerable. I think that's an excellent idea, so a few minor modifications and we have an even better solution, not requiring the generic constraint TWrite : TRead:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: Consolas, "Courier New", Courier, Monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: Consolas, "Courier New", Courier, Monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	MARGIN: 0em
}
.csharpcode .rem {
	COLOR: #008000
}
.csharpcode .kwrd {
	COLOR: #0000ff
}
.csharpcode .str {
	COLOR: #006080
}
.csharpcode .op {
	COLOR: #0000c0
}
.csharpcode .preproc {
	COLOR: #cc6633
}
.csharpcode .asp {
	BACKGROUND-COLOR: #ffff00
}
.csharpcode .html {
	COLOR: #800000
}
.csharpcode .attr {
	COLOR: #ff0000
}
.csharpcode .alt {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;
&lt;PRE class=csharpcode&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;interface&lt;/SPAN&gt; ILockedObject&amp;lt;TRead, TWrite&amp;gt; 
    {
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Read(Action&amp;lt;TRead&amp;gt; action);
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Write(Action&amp;lt;TWrite&amp;gt; action);
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Replace(ReplaceAction&amp;lt;TWrite&amp;gt; action);
    }
        
    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ReaderWriterLockedObject&amp;lt;TRead, TWrite&amp;gt; : ILockedObject&amp;lt;TRead,TWrite&amp;gt;
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ReaderWriterLockedObject(TWrite &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;, Converter&amp;lt;TWrite, TRead&amp;gt; makeReadOnly)
        {
            MakeReadOnly = makeReadOnly;
            _value = &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;;
        }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Converter&amp;lt;TWrite, TRead&amp;gt; MakeReadOnly
        {
            get;
            &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set;
        }

        TWrite _value;
        ReaderWriterLockSlim _rwLock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReaderWriterLockSlim();
        
        &lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt; ILockedObject&amp;lt;T&amp;gt; Members

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Read(Action&amp;lt;TRead&amp;gt; action)

        {
            _rwLock.EnterReadLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(MakeReadOnly(_value));
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.ExitReadLock();
            }
        }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Write(Action&amp;lt;TWrite&amp;gt; action)
        {
            _rwLock.EnterWriteLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(_value);
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.ExitWriteLock();
            }
        }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Replace(ReplaceAction&amp;lt;TWrite&amp;gt; action)
        {
            _rwLock.EnterWriteLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; _value);
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.EnterWriteLock();
            }
        }

        &lt;SPAN class=preproc&gt;#endregion&lt;/SPAN&gt;
    }

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReplaceAction&amp;lt;T&amp;gt;(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; T &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;);
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Oh, and here is a ReadOnlyList&amp;lt;T&amp;gt; class to go along:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;
&lt;PRE class=csharpcode&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ReadOnlyList&amp;lt;T&amp;gt; : IEnumerable&amp;lt;T&amp;gt;
        {
            IList&amp;lt;T&amp;gt; _list;
            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ReadOnlyList(IList&amp;lt;T&amp;gt; list)
            {
                _list = list;
            }

            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; T &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;[&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; index]
            {
                get
                {
                    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; _list[index];
                }
            }

            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; Count
            {
                get
                {
                    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; _list.Count;
                }
            }
            
            &lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt; IEnumerable&amp;lt;T&amp;gt; Members

            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; IEnumerator&amp;lt;T&amp;gt; GetEnumerator()
            {
                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; _list.GetEnumerator();
            }

            &lt;SPAN class=preproc&gt;#endregion&lt;/SPAN&gt;

            &lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt; IEnumerable Members

            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; _list.GetEnumerator();
            }

            &lt;SPAN class=preproc&gt;#endregion&lt;/SPAN&gt;
        }&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;So now we can do this:&lt;/P&gt;&lt;PRE class=csharpcode&gt;ReaderWriterLockedObject&amp;lt;ReadOnlyList&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;, List&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;&amp;gt; lockedObject = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReaderWriterLockedObject&amp;lt;ReadOnlyList&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;, List&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;&amp;gt;(l, c =&amp;gt;  &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReadOnlyList&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt; (c));            &lt;/PRE&gt;
&lt;P mce_keep="true"&gt;If we really want to be slick, we could take it a step further... protecting the elements inside our list:&lt;/P&gt;&lt;PRE class=csharpcode&gt;ReaderWriterLockedObject&amp;lt;ReadOnlyList&amp;lt;&lt;FONT color=#0000ff&gt;ReadOnlyCustomer&lt;/FONT&gt;&amp;gt;, List&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;&amp;gt; lockedObject = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReaderWriterLockedObject&amp;lt;ReadOnlyList&amp;lt;&lt;SPAN class=kwrd&gt;ReadOnlyCustomer&lt;/SPAN&gt;&amp;gt;, List&amp;lt;&lt;SPAN class=kwrd&gt;Customer&lt;/SPAN&gt;&amp;gt;&amp;gt;(l, wl =&amp;gt;  &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReadOnlyList&amp;lt;&lt;SPAN class=kwrd&gt;ReadOnlyCustomer&lt;/SPAN&gt;&amp;gt; (wl, wc =&amp;gt; (ReadOnlyCustomer)wc)); &lt;/PRE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6452084" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Threading/default.aspx">Threading</category></item><item><title>Making the Possible Impossible</title><link>http://weblogs.asp.net/jezell/archive/2008/07/27/making-the-possible-impossible.aspx</link><pubDate>Sun, 27 Jul 2008 17:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6450532</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6450532</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/07/27/making-the-possible-impossible.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Have you ever gone to a restraunt with a menu that was just too big? Every once and a while I wind up at a place with a huge menu and it takes forever to choose what kind of food I'm going to eat. That's not a problem when I go to a steak house. When I go&amp;nbsp;to a steak house, I know exactly what I want. A rib-eye medium well with a side of mashed potatoes. Removing options always makes it easier to choose the right thing.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Programming is the same way. A lot of complexity in code exists only because we give ourselves too many options. For instance, consider the following code:&lt;/P&gt;
&lt;P mce_keep="true"&gt;List&amp;lt;object&amp;gt; myList = new List&amp;lt;object&amp;gt;();&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomething()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; foreach(object o in myList) { Console.WriteLine(o); }&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomethingElse()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; myList.Add(new object());&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;This all looks fine and dandy, until two threads hit these methods at the same time and your app crashes. We can try to make this better like so:&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomething()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; lock(myList)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(object o in myList) { Console.WriteLine(o); }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomethingElse()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; lock(myList)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;myList.Add(new object()); &lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;Which again works, but you always have to remember to lock the object. Some times you might forget. Why? Because you can. Nothing in the compiler and nothing in the .NET framework will tell you that you have to lock the object, it just assumes you are a threading wizard. There must be a better way... a way that we can gaurentee that we will never forget to lock our objects, but not make our code a complete mess at the same time. How about explicitly coding our intentions. Something like:&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomething()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;myList.Read(list =&amp;gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(object o in list) { Console.WriteLine(o); }&lt;BR&gt;&amp;nbsp; });&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;public void DoSomethingElse()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;myList.Write(list =&amp;gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.Add(new object()); &lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now, you might look at this code and say, "But I could still write to the list in the read block". Well, again, that is only if you give yourself that option. We can prevent that kind of situation completely with this little class I put together after reflecting on some comments from Eyal (&lt;A href="http://blogs.microsoft.co.il/blogs/eyal/archive/2008/07/27/esb-on-iserviceoriented.aspx" mce_href="http://blogs.microsoft.co.il/blogs/eyal/archive/2008/07/27/esb-on-iserviceoriented.aspx"&gt;http://blogs.microsoft.co.il/blogs/eyal/archive/2008/07/27/esb-on-iserviceoriented.aspx&lt;/A&gt;):&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;
&lt;PRE class=csharpcode&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;interface&lt;/SPAN&gt; ILockedObject&amp;lt;TRead, TWrite&amp;gt; &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; TWrite : TRead
    {
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Read(Action&amp;lt;TRead&amp;gt; action);
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Write(Action&amp;lt;TWrite&amp;gt; action);
        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Replace(ReplaceAction&amp;lt;TWrite&amp;gt; action);
    }

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ReaderWriterLockedObject&amp;lt;TRead, TWrite&amp;gt; : ILockedObject&amp;lt;TRead,TWrite&amp;gt; &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; TWrite : TRead
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ReaderWriterLockedObject()
        {            
        }
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ReaderWriterLockedObject(TWrite &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;)
        {
            _value = &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;;
        }
        TWrite _value;
        ReaderWriterLockSlim _rwLock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ReaderWriterLockSlim();
        

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Read(Action&amp;lt;TRead&amp;gt; action)
        {
            _rwLock.EnterReadLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(_value);
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.ExitReadLock();
            }
        }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Write(Action&amp;lt;TWrite&amp;gt; action)
        {
            _rwLock.EnterWriteLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(_value);
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.ExitWriteLock();
            }
        }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Replace(ReplaceAction&amp;lt;TWrite&amp;gt; action)
        {
            _rwLock.EnterWriteLock();
            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
            {
                action(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; _value);
            }
            &lt;SPAN class=kwrd&gt;finally&lt;/SPAN&gt;
            {
                _rwLock.EnterWriteLock();
            }
        }

    }

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReplaceAction&amp;lt;T&amp;gt;(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; T &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;);
&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;P&gt;Now simply&amp;nbsp;change your code to define the list as: &lt;BR&gt;&lt;BR&gt;ILockedObject&amp;lt;IEnumerable&amp;lt;object&amp;gt;, IList&amp;lt;object&amp;gt;&amp;gt; _list = new ReaderWriterLockedObject&amp;lt;IEnumerable&amp;lt;object&amp;gt;, IList&amp;lt;object&amp;gt; &amp;gt;(new List&amp;lt;object&amp;gt;());&lt;/P&gt;
&lt;P&gt;And it will be impossible for you to access the list without locking it and impossible&amp;nbsp; for you to write to the list when you requested a read lock (ok, not impossible because you could make a bonehead move and cast it back to list or something, but it is much harder to mess up now). You'll still need to deal with other threading issues, but you'll have one less bad choice to worry about. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6450532" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Threading/default.aspx">Threading</category></item><item><title>All Clouds Are Not Made Equal</title><link>http://weblogs.asp.net/jezell/archive/2008/07/25/all-clouds-are-not-made-equal.aspx</link><pubDate>Fri, 25 Jul 2008 18:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6443304</guid><dc:creator>Jesse Ezell</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jezell/rsscomments.aspx?PostID=6443304</wfw:commentRss><comments>http://weblogs.asp.net/jezell/archive/2008/07/25/all-clouds-are-not-made-equal.aspx#comments</comments><description>&lt;BLOCKQUOTE&gt;
&lt;P&gt;As we rollout &lt;A href="http://www.microsoft.com/online" target=_blank mce_href="http://www.microsoft.com/online" closure_hashCode_="2225"&gt;&lt;STRONG&gt;Microsoft Online Services&lt;/STRONG&gt;&lt;/A&gt; this becomes a crucial factor especially when you begin to delve in to the laws and regulations of each country and how they implement data privacy. &lt;/P&gt;
&lt;P&gt;What’s my point here? My point is that &lt;STRONG&gt;all clouds are not made equal&lt;/STRONG&gt; and it’s not a simple thing to flip from being a consumer cloud vendor to an enterprise cloud vendor. The rules and expectations are &lt;EM&gt;very&lt;/EM&gt; different. Flipping the other way, enterprise to consumer is a damn sight easier I’d say.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;[1] &lt;A href="http://blogs.msdn.com/stevecla01/archive/2008/07/25/are-all-clouds-created-equal.aspx" mce_href="http://blogs.msdn.com/stevecla01/archive/2008/07/25/are-all-clouds-created-equal.aspx"&gt;http://blogs.msdn.com/stevecla01/archive/2008/07/25/are-all-clouds-created-equal.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6443304" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jezell/archive/tags/Cloud+Services/default.aspx">Cloud Services</category><category domain="http://weblogs.asp.net/jezell/archive/tags/Web+Services/default.aspx">Web Services</category></item></channel></rss>