internal void AddTransformChain(AssetFileExtension assetFileExtension, params Type[] transforms) { if (null == assetFileExtension) { throw new ArgumentNullException(nameof(assetFileExtension)); } if (null == transforms || 0 == transforms.Length) { throw new ArgumentException($"No transforms specified for the predicate."); } Type typeOfITransform = typeof(ITransform); if (!transforms.Any(t => typeOfITransform.IsAssignableFrom(t))) { throw new InvalidCastException("All transform types must implement the interface ITransform."); } if (transforms.Any(t => !t.IsClass || t.IsAbstract || !t.IsPublic)) { throw new InvalidCastException("All transform types must be concrete public classes."); } this.TransformChains[assetFileExtension] = transforms.ToList(); // calling this method for the same key will overwrite the existing chain }
public async Task <OptimizationResult> OptimizeAsync(IOptimizationContext context, AssetFileExtension assetFileExtension) { if (null == assetFileExtension) { assetFileExtension = string.Empty; } if (!context.Assets.Any()) { return(OptimizationResult.Empty); } var orderedAssets = this.Orderer.Order(context.Assets.Where(a => 0 == string.Compare(Path.GetExtension(a.Location.ToString()), assetFileExtension, StringComparison.OrdinalIgnoreCase))); foreach (var asset in orderedAssets) { bool isAssetLoaded = false; foreach (var loader in this.Loaders) { if (loader.CanLoad(asset)) { this.Logger.LogTrace($"Loading asset '{asset.Location}' using '{nameof(loader)}'."); using (var stream = await loader.OpenReadStreamAsync(asset)) { await asset.SetContentAsync(stream); isAssetLoaded = true; } break; } } if (!isAssetLoaded) { throw new InvalidOperationException($"Couldn't find an asset loader to load the asset from '{asset.Location}'."); } } IEnumerable <Asset> assets = orderedAssets; foreach (var transformPair in this.TransformChains.Where(x => 0 == string.Compare(x.Key, assetFileExtension, StringComparison.OrdinalIgnoreCase))) { foreach (ITransform transform in transformPair.Value) { if (null == this.Events?.TransformRunning || this.Events.TransformRunning.Invoke(assetFileExtension, this.Options, transform)) { var inputAssets = assets.ToArray(); assets = await transform.TransformAsync(assetFileExtension, inputAssets); await transform.CleanUpAsync(inputAssets); } } break; } var optimizationResult = new OptimizationResult(); await optimizationResult.InitializeAsync(assets); return(optimizationResult); }