Как я могу изменить имя по умолчанию для предварительно скомпилированного View в .Views.dll и использовать это имя для вызова через действие Controller? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь создать модульную архитектуру, используя ASP.Net Core 2.2 и MVC.По сути, у меня есть базовое веб-приложение ASP.Net Core 2.2.А потом я хочу продолжать добавлять библиотеки классов, чтобы они выступали в качестве функций для моего приложения.Я направляю эти функции, настраивая AreaViewLocationFormats.Мои библиотеки классов ориентированы на SDK - Microsoft.NET.Sdk.Razor.При сборке я вижу .Views.dll, и мое базовое приложение может сканировать их и добавить на фабрику приложений.

При запуске приложения я сканирую dll и Views.dll этих библиотек классов, а затем добавляю их в части приложения, как это (я упростил это, чтобы я мог поделиться):

foreach (var file in plugInFolder.GetFileSystemInfos("*.dll", SearchOption.AllDirectories))
                {
                    Assembly assembly;
                    try
                    {
                        assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
                    }
                    catch (FileLoadException ex)
                    {
                        // If assembly is already loaded, we'll just catch it and continue to the next one, plugins can have same dependencies:
                        if (ex.Message == "Assembly with same name is already loaded")
                        {
                            continue;
                        }
                        throw;
                    }


                    //If its a View Assembly then we need to load it differently:
                    if (assembly.FullName.Contains(".Views"))
                    {
                        mvcBuilder.ConfigureApplicationPartManager(mgr => {
                            foreach (var b in CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts(assembly))
                            {                                
                                mvcBuilder.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(b));
                            }

                        });

                    }
                    // If plugin hasn't been loaded already
                    else if (!plugins.ContainsKey(pluginFolder.Name) &&   // plug in isn't loaded already and
                            pluginFolder.Name == assembly.GetName().Name) // plug in Name matches Folder Name {Our convention}
                    {
                        plugins.Add(pluginFolder.Name, new PlugInInfo { Name = pluginFolder.Name, Assembly = assembly, Path = pluginFolder.PhysicalPath });
                        //plugin load:
                        mvcBuilder.AddApplicationPart(assembly);


                    }


                }

Проблема с Views.dll в том, что у них ниже странные атрибуты (проверено через ILSpy):

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RazorCompiledItem(typeof(Views_Home_Index), "mvc.1.0.view", "/Views/Home/Index.cshtml")]
[assembly: RazorView("/Views/Home/Index.cshtml", typeof(Views_Home_Index))]

Я думаю, что из-за "/Views/Home/Index.cshtml"В вышеупомянутой компиляции я могу вызывать свои представления только в том случае, если я использую

return View("/Views/Home/Index.cshtml")

. Проблема в том, что я не могу использовать то же имя Views-Home-Index с другими библиотеками классов.Сейчас я могу обходиться без предварительной компиляции представлений и использования файлов cshtml.Но я хотел иметь преимущество предварительно скомпилированных представлений.Я ссылался на документы MS для Razor SDK, но не смог получить соответствующую помощь, или я что-то пропустил.Могу ли я что-нибудь сделать, чтобы исправить эти имена скомпилированных представлений?Пожалуйста, руководство.

Я полагаю, что наименование исходит из местоположения соглашения View for MVC, но я хочу иметь возможность вызывать мое представление по

return View("<FeatureName>/Views/Home/Index.cshtml");

Но в настоящее время оно работает только с:

return  View("Views/Home/Index.cshtml");

1 Ответ

0 голосов
/ 30 января 2019

Я обратился к основной команде aspnet, и у меня есть ответ.Пожалуйста, обратитесь к следующему, если вы также застряли здесь и задайте мой вопрос :) https://github.com/aspnet/AspNetCore/issues/7112

...