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:)

Другие вопросы по тегам