<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel xmlns:blog="http://www.dotnetnuke.com/blog/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
    <title>Charles Nurse</title>
    <description>My personal blog on DotNetNuke.</description>
    <link>http://www.dotnetnuke.com/Resources/Blogs/BlogId/15.aspx</link>
    <language>en-US</language>
    <webMaster />
    <pubDate>Tue, 22 May 2012 02:26:39 GMT</pubDate>
    <lastBuildDate>Tue, 22 May 2012 02:26:39 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 4.0.0.0</generator>
    <item>
      <title>DotNetNuke 6.2, Beta 1 - Registration Enhancements</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3347/DotNetNuke-6-2-Beta-1-Registration-Enhancements.aspx</link>
      <description>&lt;p&gt;&lt;a href="http://www.dotnetnuke.com/Portals/25/Blog/Files/15/3347/Windows-Live-Writer-DotNet.2-Beta-1Registration-Enhancements_73E5-Registration_6_2_02_5.png"&gt;&lt;img width="240" height="152" align="right" style="border: 0px none; background-image: none; margin: 0px 0px 15px 15px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; float: right;" title="Registration_6_2_02" alt="Registration_6_2_02" src="/Portals/25/Blog/Files/15/3347/Windows-Live-Writer-DotNet.2-Beta-1Registration-Enhancements_73E5-Registration_6_2_02_thumb_1.png" /&gt;&lt;/a&gt;As part of building a robust Social platform, we have added a number of enhancements to Registration.&lt;/p&gt;
&lt;h3&gt;Registration, Login and Profile Settings&lt;/h3&gt;
&lt;p&gt;DotNetNuke is a very powerful and flexible platform.  The challenge that this brings is that it is often difficult to know where to make configuration changes.  User/Registration settings is one such area.  In this Beta we have tried to address this by moving the Registration settings to the Admin/Site Settings page.  Admins are familiar with going to this page to make configuration changes.&lt;/p&gt;</description>
      <author />
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3347/DotNetNuke-6-2-Beta-1-Registration-Enhancements.aspx#Comments</comments>
      <slash:comments>5</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3347/DotNetNuke-6-2-Beta-1-Registration-Enhancements.aspx</guid>
      <pubDate>Tue, 10 Apr 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3347</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Module Development 101: 2 - What is a Module?</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3337/DotNetNuke-Module-Development-101-2-What-is-a-Module.aspx</link>
      <description>&lt;p&gt;&lt;em&gt;This &lt;/em&gt;&lt;a href="http://charlesnurse.com/post/DotNetNuke-Module-Development-101-2-What-is-a-Module.aspx"&gt;blog&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;em&gt; has been cross-posted from my personal &lt;/em&gt;&lt;a href="http://www.charlesnurse.com/"&gt;&lt;em&gt;blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href="http://www.dotnetnuke.com../../../../../EntryId/3335/DotNetNuke-Module-Development-101-1-I-did-it-My-Way.aspx"&gt;first post&lt;/a&gt; in this series I pointed out that DotNetNuke places few requirements on module developers, and this is often daunting to new developers – “where do I start?” being a common refrain.&lt;/p&gt;
&lt;p&gt;So where do you start?  &lt;/p&gt;
&lt;p&gt;Before we actually start to build our first module lets look at what constitutes a module.  In the default DotNetNuke skin/template that is used when installing DotNetNuke there are a number of examples of Text/HTML modules.  &lt;/p&gt;
&lt;p&gt;As an example Figure 1 shows 3 such modules on the Home Page.&lt;/p&gt;
&lt;h4&gt;&lt;/h4&gt;</description>
      <author />
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3337/DotNetNuke-Module-Development-101-2-What-is-a-Module.aspx#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3337/DotNetNuke-Module-Development-101-2-What-is-a-Module.aspx</guid>
      <pubDate>Wed, 04 Apr 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3337</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Module Development 101: 1 - I did it My Way</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3335/DotNetNuke-Module-Development-101-1-I-did-it-My-Way.aspx</link>
      <description>&lt;p&gt;&lt;em&gt;This &lt;/em&gt;&lt;a href="http://www.charlesnurse.com/post/DotNetNuke-Module-Development-101-1-I-did-it-My-Way.aspx"&gt;&lt;em&gt;blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt; has been cross-posted from my personal &lt;/em&gt;&lt;a href="http://www.charlesnurse.com/"&gt;&lt;em&gt;blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="239" height="240" align="right" style="background-image: none; border-width: 0px; margin: 0px 0px 10px 20px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-style: solid; float: right;" src="http://images2.layoutsparks.com/1/112578/nice-kids-puzzle-piece.png" /&gt;DotNetNuke has a rich eco-system of Modules, both Open Source and Commercial.  In many ways this is our biggest strength as a CMS platform.  No matter what you want to do with your site – there is often a module that already does it.&lt;/p&gt;
In my opinion this is due to the flexibility provided by the core DotNetNuke Framework.  Many other platforms are very prescriptive – as an extension developer you have to follow a fixed shopping list of rules – there is invariably only one way to create an extension, which may not work for what you want to do.&lt;div class="tags"&gt;Tags: Module Development&lt;/div&gt;&lt;div class="category"&gt;Category: &lt;a href=http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx&gt;Development&lt;/a&gt;&lt;/div&gt;</description>
      <author />
      <category domain="http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx">Development</category>
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3335/DotNetNuke-Module-Development-101-1-I-did-it-My-Way.aspx#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3335/DotNetNuke-Module-Development-101-1-I-did-it-My-Way.aspx</guid>
      <pubDate>Fri, 30 Mar 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3335</trackback:ping>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/10.aspx">Module Development</blog:tag>
    </item>
    <item>
      <title>DotNetNuke 6.2 CTP 1: Profile Changes</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3313/DotNetNuke-6-2-CTP-1-Profile-Changes.aspx</link>
      <description>&lt;p&gt;&lt;a href="http://www.dotnetnuke.com/Portals/25/Blog/Files/15/3313/Windows-Live-Writer-DotNetNuke-6.2-CTP-1--Profile-Changes_7D88-Profile_Changes_01_2.jpg"&gt;&lt;img style="background-image: none; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 15px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;         float: right;border-width: 0px;border-style: solid;" title="Profile_Changes_01" alt="Profile_Changes_01" align="right" src="/Portals/25/Blog/Files/15/3313/Windows-Live-Writer-DotNetNuke-6.2-CTP-1--Profile-Changes_7D88-Profile_Changes_01_thumb.jpg" width="258" height="290" /&gt;&lt;/a&gt;DotNetNuke 6.2.0 CTP 1 introduces a number of Profile updates - many of which update the Visibility options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Admin-Only Properties&lt;/strong&gt; - while this has always been available through the Visible property, this has been made clearer in the Help text for the property. &lt;/p&gt;
&lt;p&gt;A Profile Property whose Visible property is false cannot be viewed in the Profile page by the user (but is visible to Administrators when they edit the user's profile, and is available to Module Developers through the API).&lt;/p&gt;</description>
      <author />
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3313/DotNetNuke-6-2-CTP-1-Profile-Changes.aspx#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3313/DotNetNuke-6-2-CTP-1-Profile-Changes.aspx</guid>
      <pubDate>Fri, 02 Mar 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3313</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Patterns and Practices - 2: Testable Controllers</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3310/DotNetNuke-Patterns-and-Practices-2-Testable-Controllers.aspx</link>
      <description>&lt;p&gt;So here it is – the first real post in our series on DotNetNuke Patterns and Practices.  How do we make our “Controllers” testable.&lt;/p&gt;  &lt;p&gt;Historically, DotNetNuke has used a “Repository” style for manipulating entities in the business layer (rather than an Active Record style) – a lightweight Entity class – usually suffixed with Info, and a Repository class which has traditionally used Controller as a suffix.  &lt;/p&gt;  &lt;p&gt;This naming strategy was present initially  in the iBuySpy Portal Starter-Kit upon which DotNetNuke is based.  Thus, for instance, if the business layer needs to model Task objects, there will be a TaskInfo entity and a TaskController repository class.&lt;/p&gt;  &lt;p&gt;Back in 2002/3 when DotNetNuke was first created, developers were not so concerned about whether they could write Unit Tests, so the pattern of use was that whenever a “controller” was needed it was constructed on the fly.  If that controller in turn needed to call a 2nd controller then it was also constructed on the fly.&lt;/p&gt;  &lt;p&gt;The problem, from a modern perspective is that it is difficult to write Unit Tests using this pattern, as there are unknown dependencies that cannot be mocked or faked.&lt;/p&gt;  &lt;h2&gt;Dependency Injection&lt;/h2&gt;  &lt;p&gt;One of the ways to solve this is to use Dependency Inversion.  This principle is one (the D) of the &lt;a href="http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;SOLID Principles of Object Oriented Design&lt;/a&gt; espoused by “Uncle” Bob Martin and others (we will review these principles in future articles in this series).  The “Dependency Inversion Principle” says that any dependencies should be based on abstractions not concretions.&lt;/p&gt;  &lt;p&gt;Dependency Injection  supports this by injecting any dependency in the form of an Interface (or abstract base class), usually through the Constructor.&lt;/p&gt;  &lt;p&gt;So if ControllerA has a dependency on IControllerB then ControllerA’s constructor should look like the following:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;private IControllerB _controllerB;

public ControllerA(IControllerB controllerB)
{
    _controllerB = controllerB;
}&lt;/pre&gt;

&lt;p&gt;The class that is constructing a ControllerA would need to also construct a concrete implementation (ControllerB) of IControllerB and pass it as a parameter.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;IControllerB controllerB = new ControllerB();

ControllerA controllerA = new ControllerA(controllerB);&lt;/pre&gt;

&lt;p&gt;In a Unit Test, the dependent interface can then be mocked, using a mocking framework like Moq or RhinoMocks or faked by creating a FakeControllerB which has a known behavior.&lt;/p&gt;

&lt;h2&gt;Dependency Injection Containers&lt;/h2&gt;

&lt;p&gt;We can make this simpler by using a Dependency Injection Container.  DotNetNuke has a simple Container and we can use this container to register all of our controllers. This can reduce some of the plumbing that we have to do.&lt;/p&gt;

&lt;p&gt;For example, we can create an instance of ControllerB and add it to the Container. &lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;ComponentFactory.RegisterComponentInstance&lt;IControllerB&gt;(new ControllerB);&lt;/pre&gt;

&lt;p&gt;Now we can modify the ControllerA class by adding a second constructor with no parameters.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public ControllerA()
    : this(ComponentFactory.GetComponent&lt;IControllerB&gt;())
{
}&lt;/pre&gt;

&lt;p&gt;With these changes in place we can go back to our original pattern of constructing an instance of ControllerA.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;var controllerA = new ControllerA();&lt;/pre&gt;

&lt;p&gt;When writing Unit Tests the dependency on IControllerB can be resolved by mocking or faking IControllerB and adding the mock (or fake) to the Container as part of the test setup.&lt;/p&gt;

&lt;p&gt;There are some examples in the core of this pattern.&lt;/p&gt;

&lt;h2&gt;Service Location&lt;/h2&gt;

&lt;p&gt;An alternative approach to Dependency Injection is to use Service Location.    In Service Location we call some service to locate an instance of the Interface that we need. &lt;/p&gt;

&lt;p&gt;The Container in DotNetNuke is actually an example of Service Location.  &lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;var b = ComponentFactory.GetComponent&lt;IControllerB&gt;();&lt;/pre&gt;

&lt;p&gt;In 6.2 we have introduced an abstract base ServiceLocator class that manages the service location.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    public abstract class ServiceLocator&lt;TContract, TSelf&gt; where TSelf : ServiceLocator&lt;TContract, TSelf&gt;, new()
    {
        private static TContract _instance;
        private static bool _isInitialized;

        protected static Func&lt;TContract&gt; Factory { get; set; }

        public static TContract Instance
        {
            get
            {
                if (!_isInitialized)
                {
                    if (Factory == null)
                    {
                        var controllerInstance = new TSelf();
                        Factory = controllerInstance.GetFactory();
                    }

                    _instance = Factory();
                    _isInitialized = true;
                }

                return _instance;
            }
        }

        public static void SetTestableInstance(TContract instance)
        {
            _instance = instance;
            _isInitialized = true;
        }

        protected abstract Func&lt;TContract&gt; GetFactory();
    }&lt;/pre&gt;

&lt;p&gt;How this works is best shown with an example.  In the CTP we have refactored the RoleController to use this new service location pattern.&lt;/p&gt;

&lt;p&gt;We have extracted an interface – IRoleController – from the original RoleController class:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    public interface IRoleController
    {
        int AddRole(RoleInfo role);
        void DeleteRole(RoleInfo role);
        RoleInfo GetRole(int portalId, Func&lt;RoleInfo, bool&gt; predicate);
        IList&lt;RoleInfo&gt; GetRoles(int portalId);
        IList&lt;RoleInfo&gt; GetRoles(int portalId, Func&lt;RoleInfo, bool&gt; predicate);
        IDictionary&lt;string, string&gt; GetRoleSettings(int roleId);
        void UpdateRole(RoleInfo role);
        void UpdateRoleSettings(RoleInfo role, bool clearCache);
    }&lt;/pre&gt;

&lt;p&gt;Next we implemented a concrete implementation of the Interface – RoleControllerImpl (which is too long to show in its entirety here).  &lt;/p&gt;

&lt;p&gt;Finally we created a class which inherits from the new ServiceLocator class – TestableRoleController.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    public class TestableRoleController : ServiceLocator&lt;IRoleController, TestableRoleController&gt;
    {
        protected override Func&lt;IRoleController&gt; GetFactory()
        {
            return () =&gt; new RoleControllerImpl();
        }
    }&lt;/pre&gt;

&lt;p&gt;This now works in a similar way to the way we use our providers. To call a method on the RoleController, we call the Instance method, which returns the current Instance of the interface.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;TestableRoleController.Instance.AddRole(role);&lt;/pre&gt;

&lt;p&gt;The Instance property of the abstract ServiceLocator base class will return an instance of the interface (IRoleController).  By default the GetFactory method is setting the internal instance to be the concrete implementation (RoleControllerImpl) but the base class also has a method SetTestableInstance.  We can now use this method to change the internal instance to a Mock or Fake, allowing us to test methods which call the TestableRoleController.&lt;/p&gt;

&lt;p&gt;We believe that this is a simple pattern which will encourage creation of Testable Controllers, and as we move closer to the 6.2 Release expect to see more of the core converted to this pattern.  Of course, the existing methods will be retained for binary compatibility, but we are also taking the opportunity to clean up some of our old APIs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: The usage of the TestableRoleController is temporary – ultimately RoleController will be refactored to inherit from the new ServiceLocator base class.&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.dotnetnuke.com/Resources/Blogs/EntryId/3310/DotNetNuke-Patterns-and-Practices-2-Testable-Controllers.aspx&gt;More ...&lt;/a&gt;&lt;div class="tags"&gt;Tags: Testing,patterns,service location&lt;/div&gt;&lt;div class="category"&gt;Category: &lt;a href=http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx&gt;Development&lt;/a&gt;&lt;/div&gt;</description>
      <author />
      <category domain="http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx">Development</category>
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3310/DotNetNuke-Patterns-and-Practices-2-Testable-Controllers.aspx#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3310/DotNetNuke-Patterns-and-Practices-2-Testable-Controllers.aspx</guid>
      <pubDate>Thu, 01 Mar 2012 16:35:58 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3310</trackback:ping>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/64.aspx">Testing</blog:tag>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/257.aspx">patterns</blog:tag>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/259.aspx">service location</blog:tag>
    </item>
    <item>
      <title>DotNetNuke 6.2 CTP 1: Maximum Roles</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3307/DotNetNuke-6-2-CTP-1-Maximum-Roles.aspx</link>
      <description>&lt;p&gt;&lt;img style="background-image: none; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 15px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;         float: right;border-width: 0px;border-style: solid;" title="DCP_0900" alt="DCP_0900" align="right" src="/Portals/25/Blog/Files/15/3307/Windows-Live-Writer-DotNetNuke-6.2-CTP-1--Maximum-Roles_7D63-DCP_0900_1.jpg" width="244" height="164" /&gt;DotNetNuke 6.2.0 removes the maximum roles limitation of previous versions. &lt;/p&gt;
&lt;p&gt;Many developers are aware that, prior to version 6.2.0, a semi-colon delimited list of roles was saved in the user's cookie. &lt;/p&gt;
&lt;p&gt;As the cookie has a fixed size, this effectively limits the number of roles to which a user could belong to about 50 (the actual limit depends on the names used for the roles – shorter role names would increase the maximum limit slightly).&lt;/p&gt;&lt;div class="category"&gt;Category: &lt;a href=http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx&gt;Development&lt;/a&gt;&lt;/div&gt;</description>
      <author />
      <category domain="http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx">Development</category>
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3307/DotNetNuke-6-2-CTP-1-Maximum-Roles.aspx#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3307/DotNetNuke-6-2-CTP-1-Maximum-Roles.aspx</guid>
      <pubDate>Wed, 29 Feb 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3307</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke 6.2 CTP1: Page Hierarchies</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3305/DotNetNuke-6-2-CTP1-Page-Hierarchies.aspx</link>
      <description>&lt;p&gt;DotNetNuke 6.2.0 introduces changes to how the Tab (Page) Hierarchy is managed.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetnuke.com/Portals/25/Blog/Files/15/3305/Windows-Live-Writer-e0708a376c05_C6DC-Page_Hierarchies_1_2.jpg"&gt;&lt;img style="border:0px;  border-image: initial; background-image: none; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 15px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; float: right;" title="Page_Hierarchies_1" alt="Page_Hierarchies_1" align="right" src="/Portals/25/Blog/Files/15/3305/Windows-Live-Writer-e0708a376c05_C6DC-Page_Hierarchies_1_thumb.jpg" width="275" height="267" /&gt;&lt;/a&gt;Due to the limitations of earlier versions of SQL Server, which we were required to support prior to DNN 5.4, the business layer had to manage the handling of the page hierarchy. Whenever a page (tab) was created or moved in the hierarchy, there was a lot of calculation to calculate the effect on other pages and update them accordingly.&lt;/p&gt;
&lt;p&gt;In a large site like this one - if a page with a large number of descendants is updated then every descendant is updated so that its "Level" and "TabPath" can be updated in the database.&lt;/p&gt;</description>
      <author />
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3305/DotNetNuke-6-2-CTP1-Page-Hierarchies.aspx#Comments</comments>
      <slash:comments>5</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3305/DotNetNuke-6-2-CTP1-Page-Hierarchies.aspx</guid>
      <pubDate>Tue, 28 Feb 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3305</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Patterns and Practices - 1: An Invitation to the Community</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3288/DotNetNuke-Patterns-and-Practices-1-An-Invitation-to-the-Community.aspx</link>
      <description>&lt;p&gt;&lt;img style="border:0px;  border-image: initial; background-image: none; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; float: right;" title="Invitation" alt="Invitation" align="right" src="/Portals/25/Blog/Files/15/3288/Windows-Live-Writer-DotNetNuke-Patterns-and-Practices---1_6DED-Invitation_3.jpg" width="244" height="184" /&gt;Welcome to a new series of blogs/articles on Patterns and Practices for development using DotNetNuke.  &lt;/p&gt;
&lt;p&gt;In this series I will be asking members of the Engineering Team  at DotNetNuke Corporation and Community Members to contribute articles describing Patterns and Best Practices for DotNetNuke development.&lt;/p&gt;&lt;div class="tags"&gt;Tags: patterns,practices&lt;/div&gt;&lt;div class="category"&gt;Category: &lt;a href=http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx&gt;Development&lt;/a&gt;&lt;/div&gt;</description>
      <author />
      <category domain="http://www.dotnetnuke.com/Resources/Blogs/CatID/9.aspx">Development</category>
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3288/DotNetNuke-Patterns-and-Practices-1-An-Invitation-to-the-Community.aspx#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3288/DotNetNuke-Patterns-and-Practices-1-An-Invitation-to-the-Community.aspx</guid>
      <pubDate>Fri, 17 Feb 2012 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3288</trackback:ping>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/257.aspx">patterns</blog:tag>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/258.aspx">practices</blog:tag>
    </item>
    <item>
      <title>Look Mom &amp;ndash; NoSQL!</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3224/Look-Mom-ndash-NoSQL.aspx</link>
      <description>&lt;p&gt;Its been a while since I blogged here, but I recently started a new blog series on my personal blog on the topic of NoSQL databases.&lt;/p&gt;  &lt;p&gt;Recently this topic and in particular a particular subclass of databases called  “Document Databases” came up in a discussion the Product Team were having on proposed features for 6.vNext..  &lt;/p&gt;  &lt;p&gt;So I decided it was time to dive into this class of databases in order to find out if they could provide some benefit to us in the Medium to Long Term.&lt;/p&gt;  &lt;p&gt;The topic is very technical so I don’t propose to reproduce every blog post here – but if you are interested in what I find out then feel free to visit my &lt;a href="http://charlesnurse.com/?tag=/NoSQL"&gt;personal blog&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.dotnetnuke.com/Resources/Blogs/EntryId/3224/Look-Mom-ndash-NoSQL.aspx&gt;More ...&lt;/a&gt;</description>
      <author />
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3224/Look-Mom-ndash-NoSQL.aspx#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3224/Look-Mom-ndash-NoSQL.aspx</guid>
      <pubDate>Thu, 17 Nov 2011 00:04:31 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3224</trackback:ping>
    </item>
    <item>
      <title>I&amp;rsquo;ll be speaking at DevReach</title>
      <link>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3176/I-rsquo-ll-be-speaking-at-DevReach.aspx</link>
      <description>I am pleased to announce that I will be speaking at &lt;a href="http://www.devreach.com/"&gt;DevReach&lt;/a&gt; in Sofia, Bulgaria next month.  This is the sixth year for this conference - which bills itself as the Premier Conference on Microsoft Technologies in Eastern and Central Europe - but its the first time for me. &lt;br /&gt;
&lt;h5&gt; &lt;a href="http://www.dotnetnuke.com/Portals/25/Blog/Files/15/3176/Windows-Live-Writer-Ill-be-speaking-at-DevReach_10630-devreach_2.jpg"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px;        border-width: 0px;border-style: solid;" title="devreach" alt="devreach" src="/Portals/25/Blog/Files/15/3176/Windows-Live-Writer-Ill-be-speaking-at-DevReach_10630-devreach_thumb.jpg" width="504" height="83" /&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div class="tags"&gt;Tags: devreach,Conference&lt;/div&gt;&lt;div class="category"&gt;Category: &lt;a href=http://www.dotnetnuke.com/Resources/Blogs/CatID/14.aspx&gt;Events&lt;/a&gt;&lt;/div&gt;</description>
      <author />
      <category domain="http://www.dotnetnuke.com/Resources/Blogs/CatID/14.aspx">Events</category>
      <comments>http://www.dotnetnuke.com/Resources/Blogs/EntryId/3176/I-rsquo-ll-be-speaking-at-DevReach.aspx#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Resources/Blogs/EntryId/3176/I-rsquo-ll-be-speaking-at-DevReach.aspx</guid>
      <pubDate>Sun, 18 Sep 2011 08:00:00 GMT</pubDate>
      <trackback:ping>http://www.dotnetnuke.comDesktopModules/BlogTrackback.aspx?id=3176</trackback:ping>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/235.aspx">devreach</blog:tag>
      <blog:tag blog:url="http://www.dotnetnuke.com/Resources/Blogs/TagID/2.aspx">Conference</blog:tag>
    </item>
  </channel>
</rss>
