public async Task ShouldIgnoreDuplicatePathsCaseInsensitive() { // Arrange var assembly1 = typeof(RazorMultiViewCompilerProviderTests).Assembly.GetName().Name; // Default assembly var assembly2 = typeof(RazorMultiViewEngineOptions).Assembly.GetName().Name; // Conifgured assembly var view1 = TestRazorCompiledItem.CreateForView(typeof(RazorMultiViewCompilerProviderTests), "test1"); var view2 = TestRazorCompiledItem.CreateForView(typeof(RazorMultiViewCompilerProviderTests), "TEST1"); var options = new RazorMultiViewEngineOptions { DefaultViewLibrary = new ViewLibraryInfo { AssemblyName = assembly1 }, ViewLibraryConfig = new Dictionary <string, string[]> { { "test", new[] { assembly2 } } } }; var accessorWithItems = GetWithItems(new Dictionary <object, object> { { options.HttpContextItemsKey, "test" } }); var partsMan = GetApplicationPartManager(new[] { view1, view2 }); // Act var provider = new RazorMultiViewCompilerProvider(partsMan, accessorWithItems, Options.Create(options)); var compiledView1 = await provider.GetCompiler().CompileAsync("/test1"); var compiledView2 = await provider.GetCompiler().CompileAsync("/TEST1"); Assert.Equal(view1, compiledView1.Item); Assert.Equal(view1, compiledView2.Item); }
public void ShouldGetDefaultCompilerWhenConfigValidButKeyNotRecognised() { // Arrange var assembly1 = typeof(RazorMultiViewCompilerProviderTests).Assembly.GetName().Name; // Default assembly var assembly2 = typeof(RazorMultiViewEngineOptions).Assembly.GetName().Name; // Conifgured assembly var options = new RazorMultiViewEngineOptions { DefaultViewLibrary = new ViewLibraryInfo { AssemblyName = assembly1 }, ViewLibraryConfig = new Dictionary <string, string[]> { { "test", new[] { assembly2 } } } }; var accessorWithItems = GetWithItems(new Dictionary <object, object> { { options.HttpContextItemsKey, "no-test" } }); var partsMan = GetApplicationPartManager(Array.Empty <RazorCompiledItem>()); // Act var provider = new RazorMultiViewCompilerProvider(partsMan, accessorWithItems, Options.Create(options)); // Assert Assert.True(provider.compilers.ContainsKey("default")); Assert.True(provider.compilers.ContainsKey("test")); Assert.Equal <IViewCompiler>(provider.GetCompiler(), provider.compilers["default"]); }
public void ShouldGetDefaultCompilerWhenNoKeyPresent() { // Arrange var partsMan = GetApplicationPartManager(Array.Empty <RazorCompiledItem>()); var options = new RazorMultiViewEngineOptions(); var accessorWithItems = GetWithItems(new Dictionary <object, object>()); // Act var provider = new RazorMultiViewCompilerProvider(partsMan, accessorWithItems, Options.Create(options)); // Assert Assert.Single(provider.compilers); Assert.True(provider.compilers.ContainsKey("default")); Assert.Equal <IViewCompiler>(provider.GetCompiler(), provider.compilers["default"]); }
public HostBasedViewLibrarySelectorMiddleware(RequestDelegate next, IOptions <RazorMultiViewEngineOptions> optionsAccessor) { _next = next; _options = optionsAccessor?.Value ?? throw new ArgumentNullException(nameof(optionsAccessor)); }
public ConfigPicker(IOptions <RazorMultiViewEngineOptions> optionsAccessor) { this.options = optionsAccessor?.Value ?? throw new ArgumentNullException(nameof(optionsAccessor)); }
public RuntimeMultiViewCompilerProvider(IHttpContextAccessor contextAccessor, ApplicationPartManager applicationPartManager, IOptions <RazorMultiViewEngineOptions> optionsAccessor, IDictionary <string, RazorProjectEngine> razorProjectEngines, PublicCSharpCompiler csharpCompiler, ILoggerFactory loggerFactory) { this.contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor)); this.options = optionsAccessor?.Value ?? throw new ArgumentNullException(nameof(optionsAccessor)); this.logger = loggerFactory.CreateLogger <RuntimeMultiViewCompiler>(); var feature = new ViewsFeature(); applicationPartManager.PopulateFeature(feature); var defaultViews = new List <CompiledViewDescriptor>(); var defaultEngine = razorProjectEngines.First(); foreach (var descriptor in feature.ViewDescriptors.Where(f => f.Item.Type.Assembly.GetName().Name.Equals(options.DefaultViewLibrary?.AssemblyName) || f.Item.Type.Assembly.GetName().Name.Equals(options.DefaultViewLibrary?.AssemblyName + ".Views", StringComparison.Ordinal))) { if (!defaultViews.Exists(v => v.RelativePath.Equals(descriptor.RelativePath, StringComparison.OrdinalIgnoreCase))) { defaultViews.Add(descriptor); } } compilers.Add("default", new RuntimeMultiViewCompiler(new Dictionary <string, RazorProjectEngine> { { defaultEngine.Key, defaultEngine.Value } }, csharpCompiler, defaultViews, logger)); // A cache list of libraries and their compiled views var libraryViewList = new Dictionary <string, List <CompiledViewDescriptor> >(); foreach (var option in options.ViewLibraryConfig) { var optionEngines = new Dictionary <string, RazorProjectEngine>(); if (compilers.ContainsKey(option.Key)) { continue; } // A list of descriptors for this option var viewDescriptors = new List <CompiledViewDescriptor>(); // Loop the requested libraries foreach (var library in option.Value) { if (razorProjectEngines.TryGetValue(library + ".Views", out var engine)) { if (!optionEngines.ContainsKey(library)) { optionEngines.Add(library + ".Views", engine); } } if (!libraryViewList.TryGetValue(library, out var liblist)) { liblist = feature.ViewDescriptors.Where(d => d.Item.Type.Assembly.GetName().Name.Equals($"{library}") || d.Item.Type.Assembly.GetName().Name.Equals($"{library}.Views")).ToList(); } foreach (var descriptor in liblist) { if (viewDescriptors.Exists(v => v.RelativePath.Equals(descriptor.RelativePath, StringComparison.OrdinalIgnoreCase))) { continue; } viewDescriptors.Add(descriptor); } } // Add any missing views from the default library foreach (var descriptor in defaultViews) { if (viewDescriptors.Exists(v => v.RelativePath.Equals(descriptor.RelativePath, StringComparison.OrdinalIgnoreCase))) { continue; } viewDescriptors.Add(descriptor); } optionEngines.Add(defaultEngine.Key, defaultEngine.Value); compilers.Add(option.Key, new RuntimeMultiViewCompiler(optionEngines, csharpCompiler, viewDescriptors, logger)); } }