public CatalogExportProvider(ComposablePartCatalog catalog, CompositionOptions compositionOptions)
        {
            Requires.NotNull(catalog, nameof(catalog));
            if (compositionOptions > (CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe | CompositionOptions.ExportCompositionService))
            {
                throw new ArgumentOutOfRangeException(nameof(compositionOptions));
            }

            _catalog            = catalog;
            _compositionOptions = compositionOptions;
            var notifyCatalogChanged = _catalog as INotifyComposablePartCatalogChanged;

            if (notifyCatalogChanged != null)
            {
                notifyCatalogChanged.Changing += OnCatalogChanging;
            }

            CompositionScopeDefinition scopeDefinition = _catalog as CompositionScopeDefinition;

            if (scopeDefinition != null)
            {
                _innerExportProvider = new AggregateExportProvider(new ScopeManager(this, scopeDefinition), new InnerCatalogExportProvider(this));
            }
            else
            {
                _innerExportProvider = new InnerCatalogExportProvider(this);
            }
            _lock = new CompositionLock(compositionOptions.HasFlag(CompositionOptions.IsThreadSafe));
            _disableSilentRejection = compositionOptions.HasFlag(CompositionOptions.DisableSilentRejection);
        }
        public static CompositionContainer RegisterCompositionService([NotNull] this Startup startup, [NotNull] IConfiguration configuration, [NotNull] string projectDirectory, [NotNull] Assembly callingAssembly, [NotNull, ItemNotNull] IEnumerable<string> additionalAssemblyFileNames, CompositionOptions options)
        {
            var toolsDirectory = configuration.GetString(Constants.Configuration.ToolsDirectory);

            if (options.HasFlag(CompositionOptions.AddWebsiteAssemblyResolver))
            {
                // add an assembly resolver that points to the website/bin directory - this will load files like Sitecore.Kernel.dll
                AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => ResolveAssembly(args, configuration);
            }

            // add application assemblies
            var coreAssembly = typeof(Constants).Assembly;

            var catalogs = new List<ComposablePartCatalog>
            {
                new AssemblyCatalog(coreAssembly),
                new AssemblyCatalog(callingAssembly)
            };

            var disableExtensions = configuration.GetBool("disable-extensions");
            if (!disableExtensions && !options.HasFlag(CompositionOptions.DisableExtensions))
            {
                // add additional assemblies - this is used in Sitecore.Pathfinder.Server to load assemblies from the /bin folder
                AddAdditionalAssemblies(catalogs, additionalAssemblyFileNames);

                // add assemblies from the tools directory
                AddFeatureAssemblies(catalogs, toolsDirectory);

                // add core extensions
                var coreExtensionsDirectory = Path.Combine(toolsDirectory, "files\\extensions");
                var coreAssemblyFileName = Path.Combine(coreExtensionsDirectory, "Sitecore.Pathfinder.Core.Extensions.dll");
                AddDynamicAssembly(catalogs, toolsDirectory, coreAssemblyFileName, coreExtensionsDirectory);
                AddAssembliesFromDirectory(catalogs, coreExtensionsDirectory);

                // add extension from [Project]/node_modules directory
                AddNodeModules(catalogs, coreAssemblyFileName, projectDirectory);

                // add projects extensions
                var projectExtensionsDirectory = configuration.GetString(Constants.Configuration.ProjectExtensionsDirectory);
                if (!string.IsNullOrEmpty(projectExtensionsDirectory))
                {
                    projectExtensionsDirectory = PathHelper.Combine(projectDirectory, projectExtensionsDirectory);
                    var projectAssemblyFileName = Path.Combine(projectExtensionsDirectory, configuration.GetString(Constants.Configuration.ProjectExtensionsAssemblyFileName));
                    AddDynamicAssembly(catalogs, toolsDirectory, projectAssemblyFileName, projectExtensionsDirectory);
                    AddAssembliesFromDirectory(catalogs, projectExtensionsDirectory);
                }
            }

            // build composition graph
            var exportProvider = new CatalogExportProvider(new AggregateCatalog(catalogs));
            var compositionContainer = new CompositionContainer(exportProvider);
            exportProvider.SourceProvider = compositionContainer;

            // register the composition service itself for DI
            compositionContainer.ComposeExportedValue<ICompositionService>(compositionContainer);
            compositionContainer.ComposeExportedValue(configuration);

            return compositionContainer;
        }
Пример #3
0
        public ImportEngine(ExportProvider sourceProvider, CompositionOptions compositionOptions)
        {
            Requires.NotNull(sourceProvider, "sourceProvider");

            this._compositionOptions              = compositionOptions;
            this._sourceProvider                  = sourceProvider;
            this._sourceProvider.ExportsChanging += this.OnExportsChanging;
            this._lock = new CompositionLock(compositionOptions.HasFlag(CompositionOptions.IsThreadSafe));
        }
Пример #4
0
        public ImportEngine(ExportProvider sourceProvider, CompositionOptions compositionOptions)
        {
            Requires.NotNull(sourceProvider, "sourceProvider");

            this._compositionOptions = compositionOptions;
            this._sourceProvider = sourceProvider;
            this._sourceProvider.ExportsChanging += this.OnExportsChanging;
            this._lock = new CompositionLock(compositionOptions.HasFlag(CompositionOptions.IsThreadSafe));
        }
Пример #5
0
        public ImportEngine(ExportProvider sourceProvider, CompositionOptions compositionOptions)
        {
            Requires.NotNull(sourceProvider, nameof(sourceProvider));

            _compositionOptions              = compositionOptions;
            _sourceProvider                  = sourceProvider;
            _sourceProvider.ExportsChanging += OnExportsChanging;
            _lock = new CompositionLock(compositionOptions.HasFlag(CompositionOptions.IsThreadSafe));
        }
Пример #6
0
        public ComposablePartExportProvider(CompositionOptions compositionOptions)
        {
            if (compositionOptions > (CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe | CompositionOptions.ExportCompositionService))
            {
                throw new ArgumentOutOfRangeException(nameof(compositionOptions));
            }

            _compositionOptions = compositionOptions;
            _lock = new CompositionLock(compositionOptions.HasFlag(CompositionOptions.IsThreadSafe));
        }
Пример #7
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="CompositionContainer"/> class
        ///     with the specified catalog and export providers.
        /// </summary>
        /// <param name="compositionSettings">
        ///     <see cref="CompositionOptions"/> enumeration with flags controlling the composition.
        /// </param>
        /// <param name="providers">
        ///     A <see cref="Array"/> of <see cref="ExportProvider"/> objects which provide
        ///     the <see cref="CompositionContainer"/> access to <see cref="Export"/> objects,
        ///     or <see langword="null"/> to set <see cref="Providers"/> to an empty
        ///     <see cref="ReadOnlyCollection{T}"/>.
        /// </param>
        /// <exception cref="ArgumentException">
        ///     <paramref name="providers"/> contains an element that is <see langword="null"/>.
        /// </exception>
        public CompositionContainer(ComposablePartCatalog catalog, CompositionOptions compositionOptions, params ExportProvider[] providers)
        {
            if (compositionOptions > (CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe | CompositionOptions.ExportCompositionService))
            {
                throw new ArgumentOutOfRangeException("compositionOptions");
            }
            this._compositionOptions = compositionOptions;

            this._partExportProvider = new ComposablePartExportProvider(compositionOptions);
            this._partExportProvider.SourceProvider = this;

            bool multiProvider = (catalog != null) || providers.Length > 0;

            if (multiProvider)
            {
                if (catalog != null)
                {
                    this._catalogExportProvider = new CatalogExportProvider(catalog, compositionOptions);
                    this._catalogExportProvider.SourceProvider = this;
                    this._localExportProvider = new AggregateExportProvider(this._partExportProvider, this._catalogExportProvider);
                }
                else
                {
                    this._localExportProvider = new AggregateExportProvider(this._partExportProvider);
                }
                if (providers != null && providers.Length > 0)
                {
                    this._ancestorExportProvider = new AggregateExportProvider(providers);
                    this._rootProvider           = new AggregateExportProvider(this._localExportProvider, this._ancestorExportProvider);
                }
                else
                {
                    this._rootProvider = this._localExportProvider;
                }
            }
            else
            {
                this._rootProvider = this._partExportProvider;
            }

            //Insert Composition Service
            if (compositionOptions.HasFlag(CompositionOptions.ExportCompositionService))
            {
                this.ComposeExportedValue <ICompositionService>(new CompositionServiceShim(this));
            }

            this._rootProvider.ExportsChanged  += this.OnExportsChangedInternal;
            this._rootProvider.ExportsChanging += this.OnExportsChangingInternal;

            this._providers = (providers != null) ? new ReadOnlyCollection <ExportProvider>((ExportProvider[])providers.Clone()) : EmptyProviders;
        }
        private static void AddFeatureAssemblies(CompositionOptions options, [NotNull, ItemNotNull] ICollection <Assembly> catalogs, [NotNull] string toolsDirectory)
        {
            // only load Sitecore.Pathfinder.*.dll assemblies for performance
            foreach (var assemblyFileName in Directory.GetFiles(toolsDirectory, "Sitecore.Pathfinder.*.dll", SearchOption.TopDirectoryOnly))
            {
                var fileName = Path.GetFileName(assemblyFileName);
                if (string.IsNullOrEmpty(fileName))
                {
                    continue;
                }

                AddAssembly(catalogs, assemblyFileName);
            }
        }
Пример #9
0
        public void Initialize_PrefixesAreSet_OnlyMatchingAssembliesAreLoaded()
        {
            var compositionOptions = new CompositionOptions
            {
                Prefixes = new [] { "Solid" }
            };

            PlatformProvider.Current = new NetStandardPlatformProvider();
            var discoveryAspect = new DiscoveryAspect(compositionOptions);

            discoveryAspect.Initialize();

            var assemblies = discoveryAspect.Assemblies;

            assemblies.Should().HaveCount(10);
        }
        private static void AddAssembliesFromDirectory(CompositionOptions options, [NotNull, ItemNotNull] ICollection <Assembly> catalogs, [NotNull] string directory)
        {
            if (!Directory.Exists(directory))
            {
                return;
            }

            // only load Sitecore.Pathfinder.*.dll assemblies for performance
            foreach (var assemblyFileName in Directory.GetFiles(directory, "Sitecore.Pathfinder.*.dll", SearchOption.AllDirectories))
            {
                var fileName = Path.GetFileName(assemblyFileName);
                if (string.IsNullOrEmpty(fileName))
                {
                    continue;
                }

                AddAssembly(catalogs, assemblyFileName);
            }
        }
        private static void AddNugetPackages([NotNull] IConfiguration configuration, CompositionOptions options, [NotNull, ItemNotNull] ICollection <Assembly> catalogs, [NotNull] string projectDirectory)
        {
            // todo: consider only loading directories listed in packages.config or scconfig.json
            var nugetPackages = Path.Combine(projectDirectory, configuration.GetString(Constants.Configuration.Packages.NugetDirectory));

            if (!Directory.Exists(nugetPackages))
            {
                return;
            }

            foreach (var directory in Directory.GetDirectories(nugetPackages))
            {
                var manifest = Path.Combine(directory, "pathfinder.extension.manifest");
                if (!File.Exists(manifest))
                {
                    continue;
                }

                AddAssembliesFromDirectory(options, catalogs, directory);
            }
        }
        private static void AddNodeModules([NotNull] IConfiguration configuration, CompositionOptions options, [NotNull, ItemNotNull] ICollection <Assembly> catalogs, [NotNull] string projectDirectory)
        {
            var nodeModules = Path.Combine(projectDirectory, configuration.GetString(Constants.Configuration.Packages.NpmDirectory));

            if (!Directory.Exists(nodeModules))
            {
                return;
            }

            foreach (var directory in Directory.GetDirectories(nodeModules))
            {
                var manifest = Path.Combine(directory, "pathfinder.json");
                if (!File.Exists(manifest))
                {
                    continue;
                }

                // todo: exclude nested node_modules directories

                AddAssembliesFromDirectory(options, catalogs, directory);
            }
        }
Пример #13
0
 public DiscoveryAspect(CompositionOptions options)
 {
     _options = options;
 }
Пример #14
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="CompositionContainer"/> class
 ///     with the specified export providers.
 /// </summary>
 /// <param name="compositionOPtionss">
 ///     <see cref="CompositionOptions"/> enumeration with flags controlling the composition.
 /// </param>
 /// <param name="providers">
 ///     A <see cref="Array"/> of <see cref="ExportProvider"/> objects which provide
 ///     the <see cref="CompositionContainer"/> access to <see cref="Export"/> objects,
 ///     or <see langword="null"/> to set <see cref="Providers"/> to an empty
 ///     <see cref="ReadOnlyCollection{T}"/>.
 /// </param>
 /// <exception cref="ArgumentException">
 ///     <paramref name="providers"/> contains an element that is <see langword="null"/>.
 /// </exception>
 public CompositionContainer(CompositionOptions compositionOptions, params ExportProvider[] providers) :
     this((ComposablePartCatalog)null, compositionOptions, providers)
 {
 }
Пример #15
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="CompositionContainer"/> class
        ///     with the specified catalog and export providers.
        /// </summary>
        /// <param name="compositionSettings">
        ///     <see cref="CompositionOptions"/> enumeration with flags controlling the composition.
        /// </param>
        /// <param name="providers">
        ///     A <see cref="Array"/> of <see cref="ExportProvider"/> objects which provide
        ///     the <see cref="CompositionContainer"/> access to <see cref="Export"/> objects,
        ///     or <see langword="null"/> to set <see cref="Providers"/> to an empty
        ///     <see cref="ReadOnlyCollection{T}"/>.
        /// </param>
        /// <exception cref="ArgumentException">
        ///     <paramref name="providers"/> contains an element that is <see langword="null"/>.
        /// </exception>
        public CompositionContainer(ComposablePartCatalog catalog, CompositionOptions compositionOptions, params ExportProvider[] providers)
        {
            if (compositionOptions > (CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe | CompositionOptions.ExportCompositionService))
            {
                throw new ArgumentOutOfRangeException("compositionOptions");
            }
            _compositionOptions = compositionOptions;

            // We always create the mutable provider
            _partExportProvider = new ComposablePartExportProvider(compositionOptions);
            _partExportProvider.SourceProvider = this;

            // Create the catalog export provider, only if necessary
            if (catalog != null)
            {
                _catalogExportProvider = new CatalogExportProvider(catalog, compositionOptions);
                _catalogExportProvider.SourceProvider = this;
            }

            // Set the local export provider
            if (_catalogExportProvider != null)
            {
                _localExportProvider           = new AggregateExportProvider(_partExportProvider, _catalogExportProvider);
                _disposableLocalExportProvider = _localExportProvider as IDisposable;
            }
            else
            {
                _localExportProvider = _partExportProvider;
            }

            // Set the ancestor export provider, if ancestors are supplied
            if ((providers != null) && (providers.Length > 0))
            {
                // Aggregate ancestors if and only if more than one passed
                if (providers.Length > 1)
                {
                    _ancestorExportProvider           = new AggregateExportProvider(providers);
                    _disposableAncestorExportProvider = _ancestorExportProvider as IDisposable;
                }
                else
                {
                    if (providers[0] == null)
                    {
                        throw ExceptionBuilder.CreateContainsNullElement("providers");
                    }
                    _ancestorExportProvider = providers[0];
                }
            }

            // finally set the root provider
            if (_ancestorExportProvider == null)
            {
                // if no ancestors are passed, the local and the root are the same
                _rootProvider = _localExportProvider;
            }
            else
            {
                int exportProviderCount        = 1 + ((catalog != null) ? 1 : 0) + ((providers != null) ? providers.Length : 0);
                ExportProvider[] rootProviders = new ExportProvider[exportProviderCount];

                rootProviders[0] = _partExportProvider;
                int customProviderStartIndex = 1;
                if (catalog != null)
                {
                    rootProviders[1]         = _catalogExportProvider;
                    customProviderStartIndex = 2;
                }

                if (providers != null)
                {
                    for (int i = 0; i < providers.Length; i++)
                    {
                        rootProviders[customProviderStartIndex + i] = providers[i];
                    }
                }

                _rootProvider           = new AggregateExportProvider(rootProviders);
                _disposableRootProvider = _rootProvider as IDisposable;
            }

//Insert Composition Service
            if (compositionOptions.HasFlag(CompositionOptions.ExportCompositionService))
            {
                this.ComposeExportedValue <ICompositionService>(new CompositionServiceShim(this));
            }

            _rootProvider.ExportsChanged  += OnExportsChangedInternal;
            _rootProvider.ExportsChanging += OnExportsChangingInternal;

            _providers = (providers != null) ? new ReadOnlyCollection <ExportProvider>((ExportProvider[])providers.Clone()) : EmptyProviders;
        }
 public NSubstituteCompositionContainer(CompositionOptions compositionOptions, params ExportProvider[] providers)
     : base(compositionOptions, AddSubstituteProvider(providers))
 {
 }
 public NSubstituteCompositionContainer(CompositionOptions compositionOptions, params ExportProvider[] providers)
     : base(compositionOptions, AddSubstituteProvider(providers))
 {
 }
        public static ICompositionService RegisterCompositionService([NotNull] this Startup startup, [NotNull] IConfiguration configuration, [NotNull] string projectDirectory, [NotNull, ItemNotNull] IEnumerable <string> additionalAssemblyFileNames, CompositionOptions options)
        {
            var toolsDirectory = configuration.GetToolsDirectory();

            // add application assemblies
            var coreAssembly = typeof(Constants).GetTypeInfo().Assembly;

            var assemblies = new List <Assembly>
            {
                coreAssembly,
                Assembly.GetEntryAssembly()
            };

            var disableExtensions = configuration.GetBool(Constants.Configuration.Extensions.Disabled);

            if (!disableExtensions && !options.HasFlag(CompositionOptions.DisableExtensions))
            {
                // add additional assemblies - this is used in Sitecore.Pathfinder.Server to load assemblies from the /bin folder
                AddAdditionalAssemblies(assemblies, additionalAssemblyFileNames);

                // add core extensions - must come before feature assemblies to ensure the correct Sitecore.Pathfinder.Core.Extensions.dll is loaded
                var coreExtensionsDirectory = Path.Combine(toolsDirectory, "files\\extensions");

                AddAssembliesFromDirectory(options, assemblies, coreExtensionsDirectory);

                // add feature assemblies from the same directory as Sitecore.Pathfinder.Core
                var binDirectory = configuration.GetString(Constants.Configuration.BinDirectory);
                if (string.IsNullOrEmpty(binDirectory))
                {
                    binDirectory = Path.GetDirectoryName(coreAssembly.Location);
                }

                if (!string.IsNullOrEmpty(binDirectory))
                {
                    AddFeatureAssemblies(options, assemblies, binDirectory);
                }

                // add extension from [Project]/packages directory
                AddNugetPackages(configuration, options, assemblies, projectDirectory);

                // add extension from [Project]/node_modules directory
                AddNodeModules(configuration, options, assemblies, projectDirectory);

                // add projects extensions
                var projectExtensionsDirectory = configuration.GetString(Constants.Configuration.Extensions.Directory);
                if (!string.IsNullOrEmpty(projectExtensionsDirectory))
                {
                    projectExtensionsDirectory = PathHelper.Combine(projectDirectory, projectExtensionsDirectory);

                    AddAssembliesFromDirectory(options, assemblies, projectExtensionsDirectory);
                }
            }

            var compositionHost = new ContainerConfiguration().WithProvider(new ConfigurationExportDescriptorProvider(configuration)).WithAssemblies(assemblies).CreateContainer();

            // todo: breaks DI
            var compositionService = ((CompositionService)compositionHost.GetExport <ICompositionService>()).With(compositionHost);

            return(compositionService);
        }