ASPNet Core 2.1 правильный способ загрузки предварительно скомпилированных представлений
Я пытаюсь добавить функциональность, подобную плагину, в мое приложение, и мне трудно найти предварительно скомпилированные представления. Допустим, у меня есть библиотека классов Razor, скомпилированная в plugin.dll и plugin.views.dll. Я успешно загружаю и добавляю plugin.dll.
Assembly PLUGIN_ASSEMBLY = null;
try
{
PLUGIN_ASSEMBLY = Assembly.LoadFile(PLUGIN.PluginFileName);
Assembly.LoadFile(PLUGIN.PluginViewsFileName);
}
catch (FileLoadException)
{
throw;
}
Затем сборка добавляется с
MVC_BUILDER.AddApplicationPart(PLUGIN_ASSEMBLY);
Затем я добавляю базовый путь к плагину, чтобы его обычные виды были открыты
MVC_BUILDER.AddRazorOptions(o =>
{
IFileProvider physicalProvider = new PhysicalFileProvider(PLUGIN.BasePath);
IFileProvider compositeProvider = new CompositeFileProvider(physicalProvider);
o.FileProviders.Add(compositeProvider);
});
Все вышеперечисленное работает отлично, за исключением того, что я могу использовать только физически расположенные виды, а не те, что на plugin.views.dll
Каков будет правильный подход, чтобы добавить views.dll и сделать открытое представление?
1 ответ
Я потратил весь день, чтобы заставить это работать.. и это работало.
В веб-приложении бритва знала, откуда брать предварительно скомпилированные представления, но в консольном приложении этого не происходит (возможно, это моя вина). Давайте поможем ему:)
Для начала нам нужно имя сборки с представлениями:
var viewAssembly = PLUGIN_ASSEMBLY.GetName().Name + ".Views";
Во-вторых, мы должны создать провайдера, который будет извлекать все скомпилированные представления из сборки:
var viewAssemblyPart = new CompiledRazorAssemblyPart(viewAssembly);
И последнее, но не менее важное - добавьте его в коллекцию других провайдеров:
MVC_BUILDER.PartManager.ApplicationParts.Add(viewAssemblyPart);
Наслаждайтесь!
Отдельное спасибо источникам из github:)