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"]);
        }
Esempio n. 4
0
 public HostBasedViewLibrarySelectorMiddleware(RequestDelegate next, IOptions <RazorMultiViewEngineOptions> optionsAccessor)
 {
     _next    = next;
     _options = optionsAccessor?.Value ?? throw new ArgumentNullException(nameof(optionsAccessor));
 }
Esempio n. 5
0
 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));
            }
        }