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; }
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)); }
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)); }
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)); }
/// <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); } }
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); } }
public DiscoveryAspect(CompositionOptions options) { _options = options; }
/// <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) { }
/// <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 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); }