Я пытаюсь создать модульную архитектуру, используя 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");