How to Create a Fragment Installer
Create your own package fragment installer
When installing a package, you may need to ensure some additional requirements to be met and / or some additional operations performed. You can do this by using your own package fragment installer.
There are two abstract classes for this:
- BasePackageFragmentInstaller
 - BasePackageFragmentUninstaller
 
Each class has the Validate method you need to implement. This is where you should check for prerequisites on the website etc before installing or uninstalling something.
Besides, BasePackageFragmentInstaller has the Install method and BasePackageFragmentUninstaller - the Uninstall method, which you should implement, too. This is where you add your installing and uninstalling code respectively.
Please note that the Validate method is called before Install or Uninstall method.
If your package fragment installer is configurable via install.xml, learn how to read its configuration programmatically. If you need information about the package being installed, find out how to get it in your code.
Creating a fragment installer
To create a custom fragment installer:
- Create a class library project in Visual Studio.
 - Add a reference to Composite.dll.
 - Create a installer class and inherit it from the abstract class 
BasePackageFragmentInstaller. - Implement the  
BasePackageFragmentInstallerclass. This will add two methods:Validate: Add your validating code hereInstall: Add your installing code here
 
For simplicity's sake we will only add a logging information to these two methods in the sample below:
using System;
using System.Collections.Generic;
using Composite.Core; // logging
using Composite.Core.PackageSystem.PackageFragmentInstallers;
namespace Demo
{
    public class FancyPackageFragmentInstaller : BasePackageFragmentInstaller
    {
        public override IEnumerable<System.Xml.Linq.XElement> Install()
        {
            Log.LogInformation("Fancy Installer", "Installing a package");
			// installation code goes here
            yield break;
        }
        public override IEnumerable<Composite.Core.PackageSystem.PackageFragmentValidationResult> Validate()
        {
            Log.LogInformation("Fancy Installer", "Validating the installation requirements");
			// validation code goes here
            yield break;
        }
    }
}
Download FancyPackageFragmentInstaller.csYou can extend this code adding the logic you need making use, among other things, of C1 CMS API. For example, in your Validate method, you can make sure that some data types should be created or check for a specific package of a specific version to have been already installed in C1 CMS.
If necessary, create your own fragment uninstaller:
- Create a unistaller class and inherit it from the abstract class 
BasePackageFragmentUninstaller. - Implement the  
BasePackageFragmentUninstallerclass. This will add two methods:- Validate: Add your validating code here
 - Uninstall: Add your uninstalling code here
 
 
Again, for he simplicity's sake we will add a logging information to these two methods:
using System;
using System.Collections.Generic;
using Composite.Core; // logging
using Composite.Core.PackageSystem.PackageFragmentInstallers;
namespace Demo
{
	public class FancyPackageFragmentUninstaller : BasePackageFragmentUninstaller
    {
        public override void Uninstall()
        {
            Log.LogInformation("Fancy Installer", "Uninstalling a package");
			// uninstallation code goes here
        }
        public override IEnumerable<Composite.Core.PackageSystem.PackageFragmentValidationResult> Validate()
        {
            Log.LogInformation("Fancy Installer", "Validating the uninstallation requirements");
			// validation code goes here
            yield break;
        }
    }
}
Download FancyPackageFragmentUninstaller.csFinally, build the project.
Using a fragment installer
To add the custom fragment installer to a CMS Package, you need to:
- Add the installer DLL to the package
 - Add a step in the package's install.xml to pre-load this DLL.
 - Add a step in install.xml that calls the fragment installer.
 
We assume that our custom package fragment installer is called "Demo.FancyPackageFragmentInstaller" contained in the assembly called "FancyInstaller".
- Create the folder 
/Binin the package (if the former doesn't exist). - Copy your 
FancyInstaller.dllin there. - Edit 
install.xml. - Within the 
mi:PackageFragmentInstallerBinarieselement, add the path to DLL:<mi:PackageFragmentInstallerBinaries> <mi:Add path="~\Bin\FancyInstaller.dll" /> </mi:PackageFragmentInstallerBinaries>
 - Within the 
mi:PackageFragmentInstallerselement, add the installer and uninstaller types:<mi:PackageFragmentInstallers> <mi:Add installerType="Demo.FancyPackageFragmentInstaller, FancyInstaller" uninstallerType="Demo.FancyPackageFragmentUninstaller, FancyInstaller" /> </mi:PackageFragmentInstallers>
 - Save the changes in the package (repack it).
 
(Download the sample package with Demo.FancyPackageFragmentInstaller.)
Installing the package
You can install the package locally.
When the package with our simplistic fragment installer is installed, two logging messages will appear in the log.

Likewise, you'll see two logging messages when uninstalling the package.


