我正在使用ABP框架,我正在实现我自己的邮件模板。
项目是使用abp项目模板创建的。我在我的应用程序模块中创建了模板:Acme.Bookstore.Application/Assets/Templates/MyEmailTemplate.tpl
。我编辑了要嵌入的文件的属性。
然后我创建了一个模板定义提供程序的实例,如下所示:
public class MyEmailTemplateDefinitionProvider : TemplateDefinitionProvider
{
public override void Define(ITemplateDefinitionContext context)
{
context.Add(
new TemplateDefinition(
MyEmailTemplates.MyEmailTemplate,
displayName: LocalizableString.Create<AccountResource>($"TextTemplate:{MyEmailTemplates.MyEmailTemplate}"),
layout: StandardEmailTemplates.Layout,
localizationResource: typeof(AccountResource)
).WithVirtualFilePath($"Assets/Templates/MyEmailTemplate.tpl", true)
);
}
}
然后我将以下行添加到我的BookstoreApplicationModule.cs
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<BookstoreApplicationModule>("Acme.Bookstore");
});
我按照这个文档做了所有这些:https://docs.abp.io/en/abp/5.3/Virtual-File-System
在本地调试时一切正常,但是当我部署项目时,它无法访问模板文件。错误如下:Volo.Abp.AbpException: Could not find a file/folder at the location: Assets/Templates/MyEmailTemplate.tpl
我已经尝试在HttpApi.Host
模块中添加AddEbedded
调用,但得到了相同的结果。我不知道我错过了什么。
郑重声明,我是在Ubuntu服务器上部署的,但这应该无关紧要。
问题是嵌入的文件没有被添加到VirtualFileSystem中。它在开发中工作是因为框架调用:
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
... Some code ...
options.FileSets.ReplaceEmbeddedByPhysical<BookstoreApplicationModule>(
Path.Combine(hostingEnvironment.ContentRootPath,
$"..{Path.DirectorySeparatorChar}Acme.Bookstore.Application"));
});
}
所以问题没有出现,直到我做了一个dotnet publish
。
我无法弄清楚为什么它不能在Application
模块上工作,但将文件移动到Domain.Shared
模块修复了它。
我猜其他模块上缺少一些包或设置,但这个解决方案对我来说已经足够了。