【发布时间】:2023-01-09 15:45:01
【问题描述】:
我有一个 ASP.NET Core 6 MVC 应用程序项目和 WebJob(控制台应用程序)的解决方案
这两个应用程序都使用一个公共库项目,我在其中有IRazorViewToStringRenderer 服务和视图。我想在 WebApp 和 WebJob 这两个应用程序中重用此服务。我的解决方案基于这个示例https://github.com/aspnet/Entropy/blob/master/samples/Mvc.RenderViewToString/Program.cs
这是我的使用方法:
var viewToStringEngine = ServiceProvider.GetService<IRazorViewToStringRenderer>();
string htmlContent = await viewToStringEngine.RenderToStringAsync<MyView>("~/Views/MyView.cshtml", new MyView());
问题是 RazorViewEngineOptions 不再有指定文件提供程序的选项(在 ASP.NET Core 6 中)
services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Clear();
options.FileProviders.Add(fileProvider);
});
IRazorViewToStringRenderer 服务在从 Web 应用程序调用时工作正常,但在 WebJob 中不工作。仅当 WebJob 服务包含 IWebHostEnvironment 且 ApplicationName 作为实施 IRazorViewToStringRenderer 的项目名称时,它才有效,否则无法找到视图。
如何为 RazorViewEngine 指定文件提供程序? (github sample)
WebJob 服务配置:
private static ServiceCollection ConfigureServices()
{
var services = new ServiceCollection();
services.AddSingleton<IConfiguration>(Configuration);
var applicationEnvironment = PlatformServices.Default.Application;
services.AddSingleton(applicationEnvironment);
services.AddSingleton<Microsoft.AspNetCore.Hosting.IWebHostEnvironment>(new WebJobHostEnvironment
{
ApplicationName = Assembly.GetEntryAssembly().GetName().Name,
//ApplicationName = typeof(IRazorViewToStringRenderer).Assembly.GetName().Name,
});
var listener = new DiagnosticListener("Microsoft.AspNetCore");
services.AddSingleton<DiagnosticListener>(listener);
services.AddSingleton<DiagnosticSource>(listener);
services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.AddSingleton<ILoggerFactory, LoggerFactory>(sp => new LoggerFactory());
services.AddMvcCore().AddRazorViewEngine();
services.AddCommonRazorEngine(Configuration);
return services;
}
RazorServiceCollectionExtension.cs
public static class RazorServiceCollectionExtension
{
public static void AddCommonRazorEngine(this IServiceCollection services, IConfiguration configuration)
{
//var fileProvider = new EmbeddedFileProvider(typeof(RazorViewToStringRenderer).Assembly);
// FileProviders property is not available anymore
services.Configure<RazorViewEngineOptions>(options =>
{
//options.FileProviders.Add(fileProvider);
});
services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
}
}
【问题讨论】: