Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

Cambrian First Look - Extension Installer (Pt 1)

In my last few blogs I have provided an overview of the new Features Module, which manages all the Extensions to the DotNetNuke Framework. (Note.  There is some debate in the core team at this time on the name to give that module, and it looks like we may be changing it to "Extensions").  This module brings all the various extension points together in one location (Authentication Systems, Containers, Languages, Modules, Providers, Skins and SkinObjects).  These blogs focussed on the Host users experience in managing these "Extensions".

In this blog I begin a series of blogs that focus on the new Extensions system from the developers perspective.  It is important to note here, that for the most part building/designing modules, skins and languages etc has not changed.  What has changed is how they are packaged, installed and uninstalled - in a universally consistent and extenisble manner.

Lets take a look at a Class Diagram of the major components of the Installer sub-system.

This diagram shows the major classes in the subsystem.  In many ways this is similar to the "old" Module Installer system.

  • Installer - This class represents the Facade (entry-point) into the sub-sytem.  In addition to its public Constructors it provides two public methods - Install and UnInstall.  This last method demonstrates the major difference between this new installer and the "old" module installer, in that it provides BOTH Install and Uninstall for the Extensions.
  • InstallerInfo - As with the "old" Module Installer, the InstallerInfo class provides information about the current instance of the Installer
  • InstallFile - This class represents each file in the installation package.
  • PackageInfo - This calls represents the Extension "Package" itself.  You will notice that a number of properties that are currently part of DesktopModules are now part of the PackageInfo object - Name, Version, FriendlyName, Description - and are hence now part of every "Extension".
  • Logger - As with the "old" Module Installer a Logger class is provided and is made available to all the components of the sub-system so that a detailed Log can be produced on INstall AND Uninstall.
  • ComponentInstallerBase and PackageInstaller - Theses classes are the core classes that do the work.  The ComponentInstallerBase class is an abstract class that provides 5 abstract methods - Install, Uninstall, ReadManifest, Commit and Rollback.  PackageInstaller is a concrete implementation that "installs" a package or extension.  The PackageInstaller has a property ComponentInstallers which is a "collection" of ComponentInstallerBases, which represent individual components in the Extension Package.

Packages and Components

In the above discussion, I have referred to the concept of Packages (PackageInfo and PackageInstaller classes) and Components.  The simple definition is that a Package is a collection of Components. 

For example a Module Package consists of a Module Component - the Module Definitions/Controls, an optional Assembly Component for compiled modules, an optional Script Component for the install/uninstall scripts and a File Component.  Similarly, an Authentication System Package consists of an Authentication System Component, an optional Assembly Component, a File Component.  The important thing to note here is that the difference between an Authentication System Package and a Module Package is that one has an Authentication System Component and the other has a Module Component - they BOTH have File and Assembly Components. 

This is the main feature of the new Installer - Packages are broken down into smaller Components so that common Install/Uninstall behaviours can be created once.  Once we have created a "library" of Component Installers, creating Installers for new Extension type becomes easy as much of the code already exists.

At the time of writing the Cambrian code-base has the following ComponentInstallers:

  • AssemblyInstaller - Installs assemblies - manages assembly versioning.
  • AuthenticationInstaller - Installs/Registers Authentication Systems.
  • CleanUpInstaller - Used to cleanup/delete old files on upgrade.
  • ConfigInstaller - Used to make changes to web.config (or any config file)
  • ContainerInstaller - Installs Container components
  • FileInstaller - Installs files
  • LanguageInstaller - Installs/Registers Languages
  • ModuleInstaller - Installs/Registers Modules
  • ResourceFileInstaller - Installs ResourceFiles (extracts the zip files and creates a manifest of the files in the zip)
  • ScriptInstaller - Runs Install/Upgrade scripts
  • SkinControlInstaller - Installs SkinControls (SkinObjects)
  • SkinInstaller - Installs Skin components

In this blog I have endeavoured to provide an overview of the new Component-based Extension Installer.  In a future blog, I will look at how this works, including a description of the new manifest that "controls" everything.


Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (21)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (269)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?