Browse Source

Merge pull request #4540 from abpframework/vfs-embedded

Implemented: Support embedded files with manifest created by Microsoft.Extensions.FileProviders.Embedded
pull/4543/head
Halil İbrahim Kalkan 6 years ago
committed by GitHub
parent
commit
047f8907fa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj
  2. 2
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs
  3. 29
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/AbpEmbeddedFileProvider.cs
  4. 22
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs
  5. 10
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs
  6. 19
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs
  7. 2
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs
  8. 52
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs
  9. 15
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs
  10. 9
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs
  11. 82
      framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs
  12. 2
      framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj
  13. 1
      framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js
  14. 25
      framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs
  15. 7
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj
  16. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs
  17. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
  18. 2
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json
  19. 5
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj
  20. 2
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs

1
framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj

@ -17,6 +17,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="3.1.5" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="3.1.5" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" />
</ItemGroup>
<ItemGroup>

2
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs

@ -3,7 +3,7 @@
public class AbpVirtualFileSystemOptions
{
public VirtualFileSetList FileSets { get; }
public AbpVirtualFileSystemOptions()
{
FileSets = new VirtualFileSetList();

29
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs → framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/AbpEmbeddedFileProvider.cs

@ -8,7 +8,7 @@ using Microsoft.Extensions.FileProviders;
namespace Volo.Abp.VirtualFileSystem.Embedded
{
public class EmbeddedFileSet : IVirtualFileSet
public class AbpEmbeddedFileProvider : DictionaryBasedFileProvider
{
[NotNull]
public Assembly Assembly { get; }
@ -16,19 +16,22 @@ namespace Volo.Abp.VirtualFileSystem.Embedded
[CanBeNull]
public string BaseNamespace { get; }
[CanBeNull]
public string BaseFolderInProject { get; }
protected override IDictionary<string, IFileInfo> Files => _files.Value;
private readonly Lazy<Dictionary<string, IFileInfo>> _files;
public EmbeddedFileSet(
public AbpEmbeddedFileProvider(
[NotNull] Assembly assembly,
[CanBeNull] string baseNamespace = null,
[CanBeNull] string baseFolderInProject = null)
[CanBeNull] string baseNamespace = null)
{
Check.NotNull(assembly, nameof(assembly));
Assembly = assembly;
BaseNamespace = baseNamespace;
BaseFolderInProject = baseFolderInProject;
_files = new Lazy<Dictionary<string, IFileInfo>>(
CreateFiles,
true
);
}
public void AddFiles(Dictionary<string, IFileInfo> files)
@ -127,5 +130,17 @@ namespace Volo.Abp.VirtualFileSystem.Embedded
return filePath.Substring(filePath.LastIndexOf("/", StringComparison.Ordinal) + 1);
}
protected override string NormalizePath(string subpath)
{
return VirtualFilePathHelper.NormalizePath(subpath);
}
private Dictionary<string, IFileInfo> CreateFiles()
{
var files = new Dictionary<string, IFileInfo>(StringComparer.OrdinalIgnoreCase);
AddFiles(files);
return files;
}
}
}

22
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs

@ -0,0 +1,22 @@
using System.Reflection;
using Microsoft.Extensions.FileProviders;
namespace Volo.Abp.VirtualFileSystem.Embedded
{
public class EmbeddedVirtualFileSetInfo : VirtualFileSetInfo
{
public Assembly Assembly { get; }
public string BaseFolder { get; }
public EmbeddedVirtualFileSetInfo(
IFileProvider fileProvider,
Assembly assembly,
string baseFolder = null)
: base(fileProvider)
{
Assembly = assembly;
BaseFolder = baseFolder;
}
}
}

10
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs

@ -1,10 +0,0 @@
using System.Collections.Generic;
using Microsoft.Extensions.FileProviders;
namespace Volo.Abp.VirtualFileSystem
{
public interface IVirtualFileSet
{
void AddFiles(Dictionary<string, IFileInfo> files);
}
}

19
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs

@ -0,0 +1,19 @@
using JetBrains.Annotations;
using Microsoft.Extensions.FileProviders;
namespace Volo.Abp.VirtualFileSystem.Physical
{
public class PhysicalVirtualFileSetInfo : VirtualFileSetInfo
{
public string Root { get; }
public PhysicalVirtualFileSetInfo(
[NotNull] IFileProvider fileProvider,
[NotNull] string root
)
: base(fileProvider)
{
Root = Check.NotNullOrWhiteSpace(root, nameof(root));
}
}
}

2
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs

@ -6,8 +6,6 @@ namespace Volo.Abp.VirtualFileSystem
{
internal static class VirtualFilePathHelper
{
//TODO: Optimize this class!
public static string NormalizePath(string fullPath)
{
if (fullPath.Equals("/", StringComparison.Ordinal))

52
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Options;
@ -28,6 +27,11 @@ namespace Volo.Abp.VirtualFileSystem
public virtual IDirectoryContents GetDirectoryContents(string subpath)
{
if (subpath == "")
{
subpath = "/";
}
return _hybridFileProvider.GetDirectoryContents(subpath);
}
@ -42,52 +46,12 @@ namespace Volo.Abp.VirtualFileSystem
fileProviders.Add(dynamicFileProvider);
if (_options.FileSets.PhysicalPaths.Any())
foreach (var fileSet in _options.FileSets.AsEnumerable().Reverse())
{
fileProviders.AddRange(
_options.FileSets.PhysicalPaths
.Select(rootPath => new PhysicalFileProvider(rootPath))
.Reverse()
);
fileProviders.Add(fileSet.FileProvider);
}
fileProviders.Add(new InternalVirtualFileProvider(_options));
return new CompositeFileProvider(fileProviders);
}
protected class InternalVirtualFileProvider : DictionaryBasedFileProvider
{
protected override IDictionary<string, IFileInfo> Files => _files.Value;
private readonly AbpVirtualFileSystemOptions _options;
private readonly Lazy<Dictionary<string, IFileInfo>> _files;
public InternalVirtualFileProvider(AbpVirtualFileSystemOptions options)
{
_options = options;
_files = new Lazy<Dictionary<string, IFileInfo>>(
CreateFiles,
true
);
}
private Dictionary<string, IFileInfo> CreateFiles()
{
var files = new Dictionary<string, IFileInfo>(StringComparer.OrdinalIgnoreCase);
foreach (var set in _options.FileSets)
{
set.AddFiles(files);
}
return files;
}
protected override string NormalizePath(string subpath)
{
return VirtualFilePathHelper.NormalizePath(subpath);
}
}
}
}

15
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs

@ -0,0 +1,15 @@
using JetBrains.Annotations;
using Microsoft.Extensions.FileProviders;
namespace Volo.Abp.VirtualFileSystem
{
public class VirtualFileSetInfo
{
public IFileProvider FileProvider { get; }
public VirtualFileSetInfo([NotNull] IFileProvider fileProvider)
{
FileProvider = Check.NotNull(fileProvider, nameof(fileProvider));
}
}
}

9
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs

@ -2,13 +2,8 @@
namespace Volo.Abp.VirtualFileSystem
{
public class VirtualFileSetList : List<IVirtualFileSet>
public class VirtualFileSetList : List<VirtualFileSetInfo>
{
public List<string> PhysicalPaths { get; }
public VirtualFileSetList()
{
PhysicalPaths = new List<string>();
}
}
}

82
framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs

@ -1,44 +1,90 @@
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using JetBrains.Annotations;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.FileProviders.Physical;
using Volo.Abp.VirtualFileSystem.Embedded;
using Volo.Abp.VirtualFileSystem.Physical;
namespace Volo.Abp.VirtualFileSystem
{
public static class VirtualFileSetListExtensions
{
public static void AddEmbedded<T>([NotNull] this VirtualFileSetList list, [CanBeNull] string baseNamespace = null, string baseFolderInProject = null)
public static void AddEmbedded<T>(
[NotNull] this VirtualFileSetList list,
[CanBeNull] string baseNamespace = null,
[CanBeNull] string baseFolder = null)
{
Check.NotNull(list, nameof(list));
list.Add(
new EmbeddedFileSet(
typeof(T).Assembly,
baseNamespace,
baseFolderInProject
)
var assembly = typeof(T).Assembly;
var fileProvider = CreateFileProvider(
assembly,
baseNamespace,
baseFolder
);
list.Add(new EmbeddedVirtualFileSetInfo(fileProvider, assembly, baseFolder));
}
public static void ReplaceEmbeddedByPhysical<T>([NotNull] this VirtualFileSetList list, [NotNull] string pyhsicalPath)
public static void AddPhysical(
[NotNull] this VirtualFileSetList list,
[NotNull] string root,
ExclusionFilters exclusionFilters = ExclusionFilters.Sensitive)
{
Check.NotNull(list, nameof(list));
Check.NotNull(pyhsicalPath, nameof(pyhsicalPath));
Check.NotNullOrWhiteSpace(root, nameof(root));
var assembly = typeof(T).Assembly;
var embeddedFileSets = list.OfType<EmbeddedFileSet>().Where(fs => fs.Assembly == assembly).ToList();
var fileProvider = new PhysicalFileProvider(root, exclusionFilters);
list.Add(new PhysicalVirtualFileSetInfo(fileProvider, root));
}
private static IFileProvider CreateFileProvider(
[NotNull] Assembly assembly,
[CanBeNull] string baseNamespace = null,
[CanBeNull] string baseFolder = null)
{
Check.NotNull(assembly, nameof(assembly));
foreach (var embeddedFileSet in embeddedFileSets)
var info = assembly.GetManifestResourceInfo("Microsoft.Extensions.FileProviders.Embedded.Manifest.xml");
if (info == null)
{
list.Remove(embeddedFileSet);
return new AbpEmbeddedFileProvider(assembly, baseNamespace);
}
if (baseFolder == null)
{
return new ManifestEmbeddedFileProvider(assembly);
}
if (!embeddedFileSet.BaseFolderInProject.IsNullOrEmpty())
return new ManifestEmbeddedFileProvider(assembly, baseFolder);
}
public static void ReplaceEmbeddedByPhysical<T>(
[NotNull] this VirtualFileSetList fileSets,
[NotNull] string physicalPath)
{
Check.NotNull(fileSets, nameof(fileSets));
Check.NotNullOrWhiteSpace(physicalPath, nameof(physicalPath));
var assembly = typeof(T).Assembly;
for (var i = 0; i < fileSets.Count; i++)
{
if (fileSets[i] is EmbeddedVirtualFileSetInfo embeddedVirtualFileSet &&
embeddedVirtualFileSet.Assembly == assembly)
{
pyhsicalPath = Path.Combine(pyhsicalPath, embeddedFileSet.BaseFolderInProject);
}
var thisPath = physicalPath;
list.PhysicalPaths.Add(pyhsicalPath);
if (!embeddedVirtualFileSet.BaseFolder.IsNullOrEmpty())
{
thisPath = Path.Combine(thisPath, embeddedVirtualFileSet.BaseFolder);
}
fileSets[i] = new PhysicalVirtualFileSetInfo(new PhysicalFileProvider(thisPath), thisPath);
}
}
}
}

2
framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj

@ -4,6 +4,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<RootNamespace />
</PropertyGroup>
@ -15,6 +16,7 @@
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" />
</ItemGroup>
</Project>

1
framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js

@ -0,0 +1 @@
//my{test}.2.9.min.js-content

25
framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs

@ -1,5 +1,4 @@
using System;
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
@ -34,6 +33,22 @@ namespace Volo.Abp.VirtualFileSystem
Encoding.UTF8.GetString(stream.GetAllBytes()).ShouldBe("//jquery-3-1-1-min.js-contents");
}
}
[Fact]
public void Should_Define_And_Get_Embedded_Resources_With_Special_Chars()
{
//Act
var resource = _virtualFileProvider.GetFileInfo("/js/my{test}.2.9.min.js");
//Assert
resource.ShouldNotBeNull();
resource.Exists.ShouldBeTrue();
using (var stream = resource.CreateReadStream())
{
Encoding.UTF8.GetString(stream.GetAllBytes()).ShouldBe("//my{test}.2.9.min.js-content");
}
}
[Fact]
public void Should_Define_And_Get_Embedded_Directory_Contents()
@ -45,7 +60,9 @@ namespace Volo.Abp.VirtualFileSystem
contents.Exists.ShouldNotBeNull();
var contentList = contents.ToList();
contentList.ShouldContain(x => x.Name == "jquery-3-1-1-min.js");
contentList.ShouldContain(x => x.Name == "my{test}.2.9.min.js");
}
[Theory]
@ -70,7 +87,9 @@ namespace Volo.Abp.VirtualFileSystem
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<TestModule>("Volo.Abp.VirtualFileSystem.MyResources");
options.FileSets.AddEmbedded<TestModule>(
baseFolder: "/Volo/Abp/VirtualFileSystem/MyResources"
);
});
}
}

7
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj

@ -5,8 +5,9 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>MyCompanyName.MyProjectName</RootNamespace>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\modules\identity\src\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identityserver\src\Volo.Abp.IdentityServer.Domain.Shared\Volo.Abp.IdentityServer.Domain.Shared.csproj" />
@ -23,4 +24,8 @@
<Content Remove="Localization\MyProjectName\*.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" />
</ItemGroup>
</Project>

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs

@ -35,7 +35,7 @@ namespace MyCompanyName.MyProjectName
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>("MyCompanyName.MyProjectName");
options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs

@ -77,8 +77,6 @@ namespace MyCompanyName.MyProjectName
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain.Shared"));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain"));
//<TEMPLATE-REMOVE>
options.FileSets.ReplaceEmbeddedByPhysical<AbpUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar)));
@ -87,6 +85,8 @@ namespace MyCompanyName.MyProjectName
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBasicThemeModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAccountWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}account{0}src{0}Volo.Abp.Account.Web", Path.DirectorySeparatorChar)));
//</TEMPLATE-REMOVE>
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain.Shared"));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain"));
});
}

2
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json

@ -1,6 +1,6 @@
{
"culture": "tr",
"texts": {
"ManageYourProfile": "Profil yönetimi"
"ManageYourProfile": "Profil yönetimi"
}
}

5
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj

@ -5,12 +5,17 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>MyCompanyName.MyProjectName</RootNamespace>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\MyProjectName\*.json" />
<Content Remove="Localization\MyProjectName\*.json" />

2
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs

@ -17,7 +17,7 @@ namespace MyCompanyName.MyProjectName
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>("MyCompanyName.MyProjectName");
options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>

Loading…
Cancel
Save