﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Announcements Provider Project</title>
    <description>This metaPost provider is for integration with the Announcements module.
The base version that this provider is being created for is Announcements 03.04.00 (which comes in DotNetNuke 04.05.00).
Initial development is being done in DNN 4.5.</description>
    <link>http://dnn.itcrossing.com/metapost-team-blog/blogid/28/</link>
    <language>en-US</language>
    <managingEditor>dagilleland@shaw.ca</managingEditor>
    <webMaster>don@itcrossing.com</webMaster>
    <pubDate>Fri, 21 Nov 2008 09:11:23 GMT</pubDate>
    <lastBuildDate>Fri, 21 Nov 2008 09:11:23 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.5.1.19887</generator>
    <item>
      <title>The Architecture of the Announcements Provider</title>
      <description>&lt;script type="text/javascript" src="/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1"&gt;&lt;/script&gt;&lt;h2&gt;Overview&lt;/h2&gt; &lt;p&gt;Recently, I noted the &lt;a href="http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/255/Default.aspx"  class="itcexpando" onclick="return mp.htmlExpand(this, { objectType: 'iframe',width:1024,height:768 } )"&gt;progress on the new Announcements Provider&lt;/a&gt; that we're sharing with the DotNetNuke + metaPost community. For those who are interested, here's a few notes regarding the architecture that we've used.&lt;/p&gt; &lt;p&gt;Creating the Announcements Provider was a bit of a challenge due to the fact that this (and every) provider is essentially built "on top of" an existing 3rd party module (albeit, one of the core DotNetNuke modules). The challenge lies in the fact that we have no control over the architecture or code of that 3rd party module. Often, module developers think of their module as extending DotNetNuke, and while they (rightfully) expect stability in the &lt;!--Begin mp_html_link_1_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_1_fd64479e'  } )"&gt;DNN&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;1&lt;/sup&gt;&lt;!--End mp_html_link_1_fd64479e--&gt; API, they often don't think of their own modules as being something that others might want to extend. As such, it's not uncommon for a team of module developers to make code changes in new versions that effectively "break" other people's extensions of that module. Such was the case for the Announcements module.&lt;/p&gt; &lt;!--Begin mp_html_detail_1_fd64479e--&gt;
&lt;div class="itcexpand-html-content" id="mp_html_1_fd64479e"&gt;
	&lt;div class="itcexpand-header"&gt;
		&lt;ul&gt;
			&lt;li class="itcexpand-move"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return false"&gt;Move&lt;/a&gt;
			&lt;/li&gt;
			&lt;li class="itcexpand-close"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return mp.close(this)"&gt;Close&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;	    
	&lt;/div&gt;
	&lt;div class="itcexpand-body"&gt;&lt;sup class="itcexpand-super"&gt;1&lt;/sup&gt;&lt;!--Begin mp_html_detail_body_1_fd64479e--&gt;
&lt;p&gt;DNN is the short name given to DotNetNuke.&lt;/p&gt;&lt;!--End mp_html_detail_body_1_fd64479e--&gt;&lt;/div&gt;
    &lt;div class="itcexpand-footer"&gt;
        &lt;div&gt;
            &lt;span class="itcexpand-resize" title="Resize"&gt;
                &lt;span&gt;&lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;!--End mp_html_detail_1_fd64479e--&gt;
 &lt;p&gt;The metaPost Announcements Provider (which I'll simply refer to as the &lt;strong&gt;&lt;em&gt;&lt;!--Begin mp_html_link_2_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_2_fd64479e'  } )"&gt;mAP&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;2&lt;/sup&gt;&lt;!--End mp_html_link_2_fd64479e--&gt;&lt;/em&gt;&lt;/strong&gt; for the rest of this article) was built to support older versions of the Announcements Modules. Basically, the idea was to target modules that were around the release of DNN 04.05.x, which was the first DNN version targeted by metaPost. Since then, the versions of Announcements that are going to be targeted for &lt;em&gt;mAP&lt;/em&gt; are 03.03.05 and upward. But, there were some significant changes in method signatures between version 03.04.00 and 04.00.00. Realizing that these changes meant not only some code bloat for &lt;strong&gt;&lt;em&gt;mAP&lt;/em&gt;&lt;/strong&gt;, but also that future "breaking" changes might occur in Announcements, it became apparent that some kind of architecture to deal with these changes was needed for our provider.&lt;/p&gt; &lt;!--Begin mp_html_detail_2_fd64479e--&gt;
&lt;div class="itcexpand-html-content" id="mp_html_2_fd64479e"&gt;
	&lt;div class="itcexpand-header"&gt;
		&lt;ul&gt;
			&lt;li class="itcexpand-move"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return false"&gt;Move&lt;/a&gt;
			&lt;/li&gt;
			&lt;li class="itcexpand-close"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return mp.close(this)"&gt;Close&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;	    
	&lt;/div&gt;
	&lt;div class="itcexpand-body"&gt;&lt;sup class="itcexpand-super"&gt;2&lt;/sup&gt;&lt;!--Begin mp_html_detail_body_2_fd64479e--&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;mAP&lt;/em&gt;&lt;/strong&gt; is the short name for the metaPost Announcements Provider - I just thot of it &lt;/p&gt;&lt;!--End mp_html_detail_body_2_fd64479e--&gt;&lt;/div&gt;
    &lt;div class="itcexpand-footer"&gt;
        &lt;div&gt;
            &lt;span class="itcexpand-resize" title="Resize"&gt;
                &lt;span&gt;&lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;!--End mp_html_detail_2_fd64479e--&gt;
 &lt;p&gt;Basically, the architecture selected for &lt;strong&gt;mAP&lt;/strong&gt; was to separate out the code that would a) map data from people's posts to the data stored in Announcements and b) deal with the version changes of the Announcements module. To do that, we used an &lt;!--Begin mp_html_link_4_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_4_fd64479e'  } )"&gt;adapter&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;4&lt;/sup&gt;&lt;!--End mp_html_link_4_fd64479e--&gt; to do the data mapping and a &lt;!--Begin mp_html_link_4_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_4_fd64479e'  } )"&gt;factory&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;4&lt;/sup&gt;&lt;!--End mp_html_link_4_fd64479e--&gt; to deal with version changes.&lt;/p&gt; &lt;h2&gt;The Adapter&lt;/h2&gt; &lt;p&gt;The adapter is the simplest part of the architecture. Basically, it consists of a single class with two static methods:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;FillAnnouncementInfo&lt;/strong&gt; - for mapping data from metaPost to the AnnouncementInfo data, and  &lt;li&gt;&lt;strong&gt;ExtractAnnouncementInfo&lt;/strong&gt; - for mapping data from AnnouncementInfo objects to metaPost&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;FillAnnouncementInfo basically allows creating or updating announcements while ExtractAnnouncementInfo is used for getting (opening) previous announcements in &lt;!--Begin mp_html_link_3_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_3_fd64479e'  } )"&gt;WLW or MS Word&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;3&lt;/sup&gt;&lt;!--End mp_html_link_3_fd64479e--&gt;. Here's a screen shot of the class diagram.&lt;/p&gt; &lt;p&gt;&lt;a href="http://dnn.itcrossing.com/Portals/5/blog_images/WLW-TheArchitectureoftheAnnouncementsProvide_6AEF-image_2.png"  class="itcexpando" onclick="return mp.expand(this,{slideshowGroup:'fd64479e'})" &gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="52" alt="Click this image to see a larger screen shot of the AnnouncementsInfoAdapter class" title="Click this image to see a larger screen shot of the AnnouncementsInfoAdapter class" src="/Portals/5/blog_images/WLW-TheArchitectureoftheAnnouncementsProvide_6AEF-image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;!--Begin mp_html_detail_3_fd64479e--&gt;
&lt;div class="itcexpand-html-content" id="mp_html_3_fd64479e"&gt;
	&lt;div class="itcexpand-header"&gt;
		&lt;ul&gt;
			&lt;li class="itcexpand-move"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return false"&gt;Move&lt;/a&gt;
			&lt;/li&gt;
			&lt;li class="itcexpand-close"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return mp.close(this)"&gt;Close&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;	    
	&lt;/div&gt;
	&lt;div class="itcexpand-body"&gt;&lt;sup class="itcexpand-super"&gt;3&lt;/sup&gt;&lt;!--Begin mp_html_detail_body_3_fd64479e--&gt;
&lt;p&gt;WLW (Windows Live Writer) and MS Word (Microsoft Word) are the two programs people use to post content through metaPost to their DNN website.&lt;/p&gt;&lt;!--End mp_html_detail_body_3_fd64479e--&gt;&lt;/div&gt;
    &lt;div class="itcexpand-footer"&gt;
        &lt;div&gt;
            &lt;span class="itcexpand-resize" title="Resize"&gt;
                &lt;span&gt;&lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;!--End mp_html_detail_3_fd64479e--&gt;
 &lt;h2&gt;The Factory&lt;/h2&gt; &lt;p&gt;For designing the "Factory", I simply used the &lt;!--Begin mp_html_link_4_fd64479e--&gt;&lt;a  href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" class="itcexpando" onclick="return mp.htmlExpand(this, { contentId:'mp_html_4_fd64479e'  } )"&gt;Factory Pattern&lt;/a&gt;&lt;sup class="itcexpand-super"&gt;4&lt;/sup&gt;&lt;!--End mp_html_link_4_fd64479e--&gt; to deal with changes to the controller classes of the Announcements module. This meant the creation of four classes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;ControllerFactory&lt;/strong&gt; - the class that is responsible for creating (and encapsulating) the "proxy" controller classes.  &lt;li&gt;&lt;strong&gt;AnnouncementsController_Proxy&lt;/strong&gt; - this is an abstract class that inherits from the AnnouncementsController and that defines the "replacement" methods to use for those that were changed in later releases of the Announcements module. The methods we needed to "replace" were the ones that added and deleted posts.  &lt;li&gt;&lt;strong&gt;AnnouncementsController_3_3_5&lt;/strong&gt; - this is a concrete class that supports the method signatures for versions 03.03.05 and 03.04.00 of the Announcements module.  &lt;li&gt;&lt;strong&gt;AnnouncementsController_4_4_0&lt;/strong&gt; - this is the concrete class that supports the Announcements module's new method signatures for version 04.00.00 and higher (or at least, until the next breaking change).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Here's a screen shot of the class diagram. Note that the abstract and concrete classes are actually internal to the ControllerFactory class. This is by design, largely to encapsulate (hide) the creation of the classes and to "force" us to only use the ControllerFactory.CreateController() method.&lt;/p&gt; &lt;p&gt;&lt;a href="http://dnn.itcrossing.com/Portals/5/blog_images/WLW-TheArchitectureoftheAnnouncementsProvide_6AEF-image3.png"  class="itcexpando" onclick="return mp.expand(this,{slideshowGroup:'fd64479e'})" &gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="Click this image to see a larger screen shot of the classes in the ControllerFactory" title="Click this image to see a larger screen shot of the classes in the ControllerFactory" src="/Portals/5/blog_images/WLW-TheArchitectureoftheAnnouncementsProvide_6AEF-image3_thumb.png" width="123" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;h2&gt;Summary&lt;/h2&gt; &lt;p&gt;What all of this allows us to do is to a) remove the complexities of breaking changes from the AnnouncementsProvider class, and b) position ourselves to deal with any possible breaking changes when future Announcements Module versions are released. In later posts, I'll release explanations of how the architecture and code works to achieve these goals.&lt;/p&gt; &lt;!--Begin mp_html_detail_4_fd64479e--&gt;
&lt;div class="itcexpand-html-content" id="mp_html_4_fd64479e"&gt;
	&lt;div class="itcexpand-header"&gt;
		&lt;ul&gt;
			&lt;li class="itcexpand-move"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return false"&gt;Move&lt;/a&gt;
			&lt;/li&gt;
			&lt;li class="itcexpand-close"&gt;
				&lt;a href="http://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.comhttp://dnn.itcrossing.com#" onclick="return mp.close(this)"&gt;Close&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;	    
	&lt;/div&gt;
	&lt;div class="itcexpand-body"&gt;&lt;sup class="itcexpand-super"&gt;4&lt;/sup&gt;&lt;!--Begin mp_html_detail_body_4_fd64479e--&gt;
&lt;p&gt;Reminder to self - put in some notes &amp; a link to explain the Adapter and Factory patterns ....&lt;/p&gt;&lt;!--End mp_html_detail_body_4_fd64479e--&gt;&lt;/div&gt;
    &lt;div class="itcexpand-footer"&gt;
        &lt;div&gt;
            &lt;span class="itcexpand-resize" title="Resize"&gt;
                &lt;span&gt;&lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;!--End mp_html_detail_4_fd64479e--&gt;
&lt;div class="d_itc_f" style="clear:both;height:11px;"&gt;&lt;script src="/DesktopModules/itcMetaPost/js/mg.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;</description>
      <link>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/256/Default.aspx</link>
      <author>dagilleland@shaw.ca</author>
      <comments>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/256/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/256/Default.aspx</guid>
      <pubDate>Tue, 12 Aug 2008 13:40:02 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://dnn.itcrossing.com/DesktopModules/Blog/Trackback.aspx?id=256</trackback:ping>
    </item>
    <item>
      <title>Progress on Announcements Provider</title>
      <description>&lt;p&gt;Well, it's been a few months since I first offered to Don to create an Announcements Provider for metaPost. I did a beta version (in VB) that I shared with Don in early April (2008), and for about three months I wasn't able to work on it due to other commitments. In that interim, Don was able to take a look at my work, port it over to C#, and address some of the concerns that arose out of breaking changes from the 3.x to 4.x versions of the module. Just recently, I was able to spend a few more days to look over Don's changes, and then I made a few more of my own. The end result is that I think we've finally got a "reasonable" version to ship in the near future.&lt;/p&gt; &lt;p&gt;Over the next while, I hope to blog a bit about the design decisions that we took in the Announcements Provider. Specifically, I want to talk a bit about the following (in no particular order):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Factory Patterns &amp; Reflections (aka: "The perils of extending 3rd party modules")  &lt;li&gt;Reflections on Writing Providers (or "Best Practices in metaPost Providers - So Far...")  &lt;li&gt;&lt;a href="http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/256/Default.aspx"&gt;The Architecture of the Announcements Provider&lt;/a&gt;  &lt;li&gt;Unit Tests for metaPost Providers&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I'm not sure when I'll get these all "finished", but I think my best bet is to simply start them with rough content and then edit them as I go along. In any case, I hope that my experiences will help other metaPost provider developers.&lt;/p&gt;&lt;div class="d_itc_f" style="clear:both;height:11px;"&gt;&lt;script src="/DesktopModules/itcMetaPost/js/mg.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;</description>
      <link>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/255/Default.aspx</link>
      <author>dagilleland@shaw.ca</author>
      <comments>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/255/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/255/Default.aspx</guid>
      <pubDate>Tue, 12 Aug 2008 12:39:09 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://dnn.itcrossing.com/DesktopModules/Blog/Trackback.aspx?id=255</trackback:ping>
    </item>
    <item>
      <title>Who am I? (and What am I Doing Here?)</title>
      <description>&lt;script type="text/javascript" src="/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx"&gt;&lt;/script&gt;&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:887EC618-8FBE-DEAD-BEEF-2339AF2EC721:9e6ad700-6d96-4b59-8a97-4b048f76f8fc" style="padding-right: 0px; display: inline; padding-left: 0px; float: left; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;a href="http://dnn.itcrossing.com/Portals/5/blog_images/WLW-WhoamIandWhatamIDoingHere_14D15-Dan2-8x6.jpg" title="Dan Gilleland" rel="thumbnail"  class="itcexpand" onclick="return hs.expand(this)" &gt;&lt;img border="0" src="/Portals/5/blog_images/WLW-WhoamIandWhatamIDoingHere_14D15-Dan2_14.png" /&gt;&lt;/a&gt;&lt;/div&gt; Hi. My name is &lt;strong&gt;&lt;font color="#0000ff"&gt;Dan Gilleland&lt;/font&gt;&lt;/strong&gt;, and I'm contributing to &lt;strong&gt;metaPost&lt;/strong&gt; by developing a provider that will work with the &lt;strong&gt;Announcements&lt;/strong&gt; module that comes packaged in &lt;a href="http://www.DotNetNuke.com" target="_blank"&gt;&lt;strong&gt;DotNetNuke&lt;/strong&gt;&lt;/a&gt;. First, I'll give you a little backgroun&lt;a href=http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/156/Default.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/156/Default.aspx</link>
      <author>dagilleland@shaw.ca</author>
      <comments>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/156/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/156/Default.aspx</guid>
      <pubDate>Sat, 05 Apr 2008 07:11:18 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://dnn.itcrossing.com/DesktopModules/Blog/Trackback.aspx?id=156</trackback:ping>
    </item>
    <item>
      <title>Finally! metaPost :)</title>
      <description>&lt;p&gt;[Copied from &lt;a href="http://www.gilleland.info/Blogging/tabid/688/EntryID/27/Default.aspx" target="_blank"&gt;my blog on Gilleland.info&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;Well, I've not blogged on any consistent level. But now, thanks in no small part to &lt;a href="http://www.itcrossing.com"&gt;metaPost&lt;/a&gt;, I think I might get back into the blogging/publishing scene some more.&lt;/p&gt; &lt;a href=http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/155/Default.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/155/Default.aspx</link>
      <author>dagilleland@shaw.ca</author>
      <comments>http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/155/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://dnn.itcrossing.com/metaPostTeamBlog/tabid/258/EntryID/155/Default.aspx</guid>
      <pubDate>Sat, 05 Apr 2008 06:43:52 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://dnn.itcrossing.com/DesktopModules/Blog/Trackback.aspx?id=155</trackback:ping>
    </item>
  </channel>
</rss>