Custom file system providers
The CMS.IO library allows you to customize Xperience to support a file system of your choice. As described in Files API and CMS.IO, you can achieve this by developing a custom provider based on the classes contained within CMS.IO.
Preparation
To implement a custom file system provider, you need to add a new assembly to the Xperience solution:
- Open your solution in Visual Studio.
- Add a new Class Library project.
Implementation
To create a file system provider, implement the following classes:
Create two separate classes that inherit from the following abstract classes:
- CMS.IO.AbstractDirectory
- CMS.IO.AbstractFile
Implement all methods defined in the abstract classes.
Create three other classes that inherit from the following classes:
- CMS.IO.DirectoryInfo
- CMS.IO.FileInfo
- CMS.IO.FileStream
Override all methods and properties from those classes.
Create constructors for the classes listed in step 3 according to the following table:
Inherits from
Constructors
CMS.IO.DirectoryInfo
public DirectoryInfo(string path)
CMS.IO.FileInfo
public FileInfo(string filename)
CMS.IO.FileStream
public FileStream(string path, CMS.IO.FileMode mode)
public FileStream(string path, CMS.IO.FileMode mode, CMS.IO.FileAccess access)
public FileStream(string path, CMS.IO.FileMode mode, CMS.IO.FileAccess access, CMS.IO.FileShare share)
public FileStream(string path, CMS.IO.FileMode mode, CMS.IO.FileAccess access, CMS.IO.FileShare share, int bSize)
Note: The custom file system provider classes must be placed into a namespace that exactly matches the name of the given assembly.
Configuration
When using a custom file system provider, register the paths it manages in the storage path registry using AddStoragePathRegistration() in Program.cs. This ensures the system is aware of all mapped paths. See Register custom paths.
Perform the following configuration steps to start using your custom file system provider:
- Add the CMSStorageProviderAssembly application setting to your project. Set the key’s value to the assembly name of your custom provider.
- Create a custom module that reads from the storage path registry and maps registered paths to your custom provider.
Example
The following code registers a module that maps all SharedPersistent paths to a custom storage provider:
using CMS;
using CMS.DataEngine;
using CMS.IO;
using Microsoft.Extensions.DependencyInjection;
// Registers the custom module into the system
[assembly: RegisterModule(typeof(CustomInitializationModule))]
public class CustomInitializationModule : Module
{
// Module class constructor, the system registers the module under the name "CustomInit"
public CustomInitializationModule()
: base("CustomInit")
{
}
// Contains initialization code that is executed when the application starts
protected override void OnInit(ModuleInitParameters parameters)
{
base.OnInit(parameters);
var pathRegistry = parameters.Services.GetRequiredService<IStoragePathRegistry>();
foreach (var registration in pathRegistry.GetRegistrations(PathType.SharedPersistent))
{
// Creates a new StorageProvider instance using the custom 'CustomFileSystemProvider' assembly
var provider = new StorageProvider("custom", "CustomFileSystemProvider");
// Maps the registered path to the provider
StorageHelper.MapStoragePath(registration.MappedPath, provider);
}
}
}
To create an instance of the StorageProvider class for your custom file system provider, call the constructor with the following parameters:
- The provider’s external storage name. Can be an empty string for providers that use the local file system. If you are using Azure Blob storage or Amazon S3 providers in your project, the Azure or Amazon names are reserved by the corresponding providers.
- The name of the class library containing the provider’s implementation.
- (Optional) A bool parameter that specifies whether the storage is shared.
For more information about storage provider mapping options, see File system providers.
For Azure Blob storage hosting, use AzureStorageProvider.Create() with the container name as the first parameter. See Azure Blob storage for Azure-specific configuration.
For Amazon S3 hosting, use AmazonStorageProvider.Create() with the S3 bucket name as the first parameter. See Amazon S3 for Amazon-specific configuration.
For production deployments, we recommend mapping both SharedPersistent and SharedTemp paths, and using environment detection (IHostEnvironment.IsDevelopment()) to skip mapping in local development.