/// <summary>
        /// Adds the specific export provider to the composer.
        /// </summary>
        /// <param name="provider">The export provider add to the composer.</param>
        /// <param name="postContainerModifier">A modifier action called after the container has been created.</param>
        public void AddExportProvider(ExportProvider provider, Action <ExportProvider, CompositionContainer> postContainerModifier = null)
        {
            if (provider == null)
            {
                throw new ArgumentNullException("provider");
            }

            ExportProviders.Add(provider);
            if (postContainerModifier != null)
            {
                postContainerModifiers.Add(provider, postContainerModifier);
            }
        }
        /// <summary>
        /// Ensures the Container has been instantiated/re-instantiated if the Composer has been modified.
        /// </summary>
        private void EnsureContainer()
        {
            if (modified || Container == null)
            {
                if (Container != null)
                {
                    Container.Dispose();
                }

                Container = new CompositionContainer(Catalog, ExportProviders.ToArray());

                foreach (var provider in postContainerModifiers.Keys)
                {
                    postContainerModifiers[provider](provider, Container);
                }

                Container.ComposeExportedValue(this);

                modified = false;
            }
        }
        private MefContainer()
        {
            if (modified || _container == null)
            {
                if (_container != null)
                {
                    _container.Dispose();
                }


                var extensionsFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty;
                extensionsFolder = Path.Combine(extensionsFolder, "Extensions");
                var catalog = new AggregateCatalog(
                    new AssemblyCatalog(Assembly.GetExecutingAssembly()),
                    new AssemblyCatalog(Assembly.GetAssembly(typeof(DatabaseConnection)))
                    );

                if (Directory.Exists(extensionsFolder))
                {
                    catalog.Catalogs.Add(new DirectoryCatalog(extensionsFolder));
                }
                if (Directory.Exists(extensionsFolder + "/HRM"))
                {
                    catalog.Catalogs.Add(new DirectoryCatalog(extensionsFolder + "/HRM"));
                }

#if SAMPLE_EXTENSIONS
                var samples = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty;
                samples = Path.Combine(samples, "OpenCBS.Extensions.Samples.dll");
                if (File.Exists(samples))
                {
                    catalog.Catalogs.Add(new AssemblyCatalog(samples));
                }
#endif
                _container = new CompositionContainer(catalog, ExportProviders.ToArray());
                modified   = false;
            }
        }