From 24c81d96bd84e055184ca2913efe6f3f3b9d3e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Apr 2018 12:37:39 +0300 Subject: [PATCH] Improved Virtual-File-System.md and minor enhancements --- docs/Index.md | 2 +- docs/Virtual-File-System.md | 48 +++++++++++++++++- .../build-action-embedded-resource-sample.png | Bin 0 -> 6844 bytes .../FileProviders/AbpFileInfoExtensions.cs | 31 +++++++++++ .../Embedded/EmbeddedFileSet.cs | 2 +- .../Volo.Abp.VirtualFileSystem.Tests.csproj | 2 +- .../VirtualFileSystem/MyResources/js/test.js | 1 + .../VirtualFileProvider_Tests.cs | 7 +-- 8 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 docs/images/build-action-embedded-resource-sample.png create mode 100644 src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs create mode 100644 test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/test.js diff --git a/docs/Index.md b/docs/Index.md index fdf43d4a6f..0fd752b9af 100644 --- a/docs/Index.md +++ b/docs/Index.md @@ -7,7 +7,7 @@ * With ASP.NET Core Web Application * Fundamentals * Dependency Injection - * Virtual File System + * [Virtual File System](Virtual-File-System.md) * Localization * Exception Handling * [Multi Tenancy](Multi-Tenancy.md) diff --git a/docs/Virtual-File-System.md b/docs/Virtual-File-System.md index aa284ee050..4c3ac5bbd8 100644 --- a/docs/Virtual-File-System.md +++ b/docs/Virtual-File-System.md @@ -30,9 +30,21 @@ namespace MyCompany.MyProject #### Registering Embedded Files +A file should be first marked as embedded resource to embed the file into the assembly. The easiest way to do it is to select the file from the **Solution Explorer** and set **Build Action** to **Embedded Resource** from the **Properties** window. Example: +![build-action-embedded-resource-sample](images/build-action-embedded-resource-sample.png) -A file should be first registered in order to use it in the application. Example: +If you want to add multiple files, this can be tedious. Alternatively, you can directly edit your **.csproj** file: + +````C# + + + +```` + +This configuration recursively adds all files under the **MyResources** folder of the project (including the files you will add in the future). + +Then the module should configure `VirtualFileSystemOptions` to register embedded files to the virtual file system. Example: ````C# using Microsoft.Extensions.DependencyInjection; @@ -58,6 +70,38 @@ namespace MyCompany.MyProject } ```` -AddEmbedded extension method takes a +`AddEmbedded` extension method takes a class, finds all embedded files from the assembly of the given class and register to the virtual file system. It's a shortcut and could be written as shown below: + +````C# +options.FileSets.Add(new EmbeddedFileSet(typeof(MyModule).Assembly)); +```` + +#### Getting Virtual Files: IVirtualFileProvider + +After embedding a file into an assembly and registering to the virtual file system, `IVirtualFileProvider` can be used to get files or directory contents: + +````C# +public class MyService +{ + private readonly IVirtualFileProvider _virtualFileProvider; + + public MyService(IVirtualFileProvider virtualFileProvider) + { + _virtualFileProvider = virtualFileProvider; + } + + public void Foo() + { + //Getting a single file + var file = _virtualFileProvider.GetFileInfo("/MyResources/js/test.js"); + var fileContent = file.ReadAsString(); //ReadAsString is an extension method of ABP + + //Getting all files/directories under a directory + var directoryContents = _virtualFileProvider.GetDirectoryContents("/MyResources/js"); + } +} +```` + + s \ No newline at end of file diff --git a/docs/images/build-action-embedded-resource-sample.png b/docs/images/build-action-embedded-resource-sample.png new file mode 100644 index 0000000000000000000000000000000000000000..d001c5d19f2dad1a07475cc01412162b7e4855ee GIT binary patch literal 6844 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 E1)w)m1poj5 literal 0 HcmV?d00001 diff --git a/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs b/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs new file mode 100644 index 0000000000..25c16b5b65 --- /dev/null +++ b/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs @@ -0,0 +1,31 @@ +using System.IO; +using System.Text; +using JetBrains.Annotations; +using Volo.Abp; + +namespace Microsoft.Extensions.FileProviders +{ + public static class AbpFileInfoExtensions + { + /// + /// Reads file content as string using encoding. + /// + public static string ReadAsString([NotNull] this IFileInfo fileInfo) + { + return fileInfo.ReadAsString(Encoding.UTF8); + } + + /// + /// Reads file content as string using the given . + /// + public static string ReadAsString([NotNull] this IFileInfo fileInfo, Encoding encoding) + { + Check.NotNull(fileInfo, nameof(fileInfo)); + + using (var stream = fileInfo.CreateReadStream()) + { + return encoding.GetString(stream.GetAllBytes()); + } + } + } +} diff --git a/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs index c846bb9c41..d2a0556527 100644 --- a/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs +++ b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs @@ -21,7 +21,7 @@ namespace Volo.Abp.VirtualFileSystem.Embedded public EmbeddedFileSet( [NotNull] Assembly assembly, - [CanBeNull] string baseNamespace, + [CanBeNull] string baseNamespace = null, [CanBeNull] string baseFolderInProject = null) { Check.NotNull(assembly, nameof(assembly)); diff --git a/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj b/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj index 1db4b6e8c4..59b82ae994 100644 --- a/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj +++ b/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/test.js b/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/test.js new file mode 100644 index 0000000000..07547e22b5 --- /dev/null +++ b/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/test.js @@ -0,0 +1 @@ +//test.js-contents \ No newline at end of file diff --git a/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs b/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs index 94679766c5..941ebb0c13 100644 --- a/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs +++ b/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs @@ -3,24 +3,25 @@ using System.Text; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem.Embedded; using Xunit; namespace Volo.Abp.VirtualFileSystem { public class VirtualFileProvider_Tests : AbpIntegratedTest { - private readonly IVirtualFileProvider _embeddedFileManager; + private readonly IVirtualFileProvider _virtualFileProvider; public VirtualFileProvider_Tests() { - _embeddedFileManager = ServiceProvider.GetRequiredService(); + _virtualFileProvider = ServiceProvider.GetRequiredService(); } [Fact] public void Should_Define_And_Get_Embedded_Resources() { //Act - var resource = _embeddedFileManager.GetFileInfo("/js/jquery-3-1-1-min.js"); + var resource = _virtualFileProvider.GetFileInfo("/js/jquery-3-1-1-min.js"); //Assert resource.ShouldNotBeNull();