NServiceBus.PersistenceStorageMerger.Merge C# (CSharp) Method

Merge() public static method

public static Merge ( List definitions, SettingsHolder settings ) : List
definitions List
settings SettingsHolder
return List
        public static List<EnabledPersistence> Merge(List<EnabledPersistence> definitions, SettingsHolder settings)
        {
            definitions.Reverse();

            var availableStorages = StorageType.GetAvailableStorageTypes();
            var mergedEnabledPersistences = new List<EnabledPersistence>();

            foreach (var definition in definitions)
            {
                var persistenceDefinition = definition.DefinitionType.Construct<PersistenceDefinition>();
                var supportedStorages = persistenceDefinition.GetSupportedStorages(definition.SelectedStorages);

                var currentDefinition = new EnabledPersistence
                {
                    DefinitionType = definition.DefinitionType,
                    SelectedStorages = new List<Type>()
                };

                foreach (var storageType in supportedStorages)
                {
                    if (availableStorages.Contains(storageType))
                    {
                        currentDefinition.SelectedStorages.Add(storageType);
                        availableStorages.Remove(storageType);
                        persistenceDefinition.ApplyActionForStorage(storageType, settings);
                    }
                }

                if (currentDefinition.SelectedStorages.Any())
                {
                    mergedEnabledPersistences.Add(currentDefinition);
                }
            }

            return mergedEnabledPersistences;
        }
    }

Usage Example

        public void Run(SettingsHolder settings)
        {
            if (!settings.TryGet("PersistenceDefinitions", out List <EnabledPersistence> definitions))
            {
                return;
            }

            var enabledPersistences = PersistenceStorageMerger.Merge(definitions, settings);

            ValidateSagaAndOutboxUseSamePersistence(enabledPersistences, settings);

            var resultingSupportedStorages = new List <Type>();
            var diagnostics = new Dictionary <string, object>();

            foreach (var definition in enabledPersistences)
            {
                var persistenceDefinition = definition.DefinitionType.Construct <PersistenceDefinition>();

                persistenceDefinition.ApplyDefaults(settings);

                foreach (var storageType in definition.SelectedStorages)
                {
                    Logger.DebugFormat("Activating persistence '{0}' to provide storage for '{1}' storage.", definition.DefinitionType.Name, storageType);
                    persistenceDefinition.ApplyActionForStorage(storageType, settings);
                    resultingSupportedStorages.Add(storageType);

                    diagnostics.Add(storageType.Name, new
                    {
                        Type    = definition.DefinitionType.FullName,
                        Version = FileVersionRetriever.GetFileVersion(definition.DefinitionType)
                    });
                }
            }

            settings.Set("ResultingSupportedStorages", resultingSupportedStorages);

            settings.AddStartupDiagnosticsSection("Persistence", diagnostics);
        }
PersistenceStorageMerger