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.