-
Notifications
You must be signed in to change notification settings - Fork 0
Virtual file system
In order to access physical files in view engines from multiple sources, ServiceStack includes its own pluggable virtual file system API that lets it support multiple filesystem backends.
The virtual file system (VFS) is what allows ServiceStack to support view engines in a standard ASP.NET websites (e.g. serving directories from the root directory) as well in self-hosting stand-alone HttpListener websites and Windows Services serving from the output /bin
directory as well as embedded resources inside .dlls, any combination of both and in future from remote datastores.
You can globally specify the VFS used by setting it in your AppHost, e.g. If you want to use an InMemory File System:
base.VirtualPathProvider = new InMemoryVirtualPathProvider(this);
Fine-grained control on which VFS to use can also be specified on any Plugins requiring access to the FileSystem like ServiceStack's built-in HTML ViewEngines, here's how you could override the VFS used in ServiceStack's Razors support:
Plugins.Add(new RazorFormat {
VirtualPathProvider = new InMemoryVirtualPathProvider(this)
});
The VFS is designed to be implementation agnostic so can be changed to use any file repository, e.g. it could easily be made to support a Redis, RDBMS, embedded Sqlite or other NoSQL back-ends.
Like most of ServiceStack's substitutable API's, the interfaces for the VFS lives in the ServiceStack.Interfaces.dll under the ServiceStack.IO namespace.
These are the API's that are needed to be implemented in order to create a new VFS:
public interface IVirtualPathProvider
{
IVirtualDirectory RootDirectory { get; }
string VirtualPathSeparator { get; }
string RealPathSeparator { get; }
string CombineVirtualPath(string basePath, string relativePath);
bool FileExists(string virtualPath);
bool DirectoryExists(string virtualPath);
IVirtualFile GetFile(string virtualPath);
string GetFileHash(string virtualPath);
string GetFileHash(IVirtualFile virtualFile);
IVirtualDirectory GetDirectory(string virtualPath);
IEnumerable<IVirtualFile> GetAllMatchingFiles(
string globPattern, int maxDepth = Int32.MaxValue);
bool IsSharedFile(IVirtualFile virtualFile);
bool IsViewFile(IVirtualFile virtualFile);
}
public interface IVirtualNode
{
IVirtualDirectory Directory { get; }
string Name { get; }
string VirtualPath { get; }
string RealPath { get; }
bool IsDirectory { get; }
DateTime LastModified { get; }
}
public interface IVirtualFile : IVirtualNode
{
IVirtualPathProvider VirtualPathProvider { get; }
string Extension { get; }
string GetFileHash();
Stream OpenRead();
StreamReader OpenText();
string ReadAllText();
}
public interface IVirtualDirectory : IVirtualNode, IEnumerable<IVirtualNode>
{
bool IsRoot { get; }
IVirtualDirectory ParentDirectory { get; }
IEnumerable<IVirtualFile> Files { get; }
IEnumerable<IVirtualDirectory> Directories { get; }
IVirtualFile GetFile(string virtualPath);
IVirtualFile GetFile(Stack<string> virtualPath);
IVirtualDirectory GetDirectory(string virtualPath);
IVirtualDirectory GetDirectory(Stack<string> virtualPath);
IEnumerable<IVirtualFile> GetAllMatchingFiles(
string globPattern, int maxDepth = Int32.MaxValue);
}
- Why ServiceStack?
- What is a message based web service?
- Advantages of message based web services
- Why remote services should use separate DTOs
- Getting Started
- Reference
- Clients
- Formats
- View Engines 4. Razor & Markdown Razor
- Hosts
- Advanced
- Configuration options
- Access HTTP specific features in services
- Logging
- Serialization/deserialization
- Request/response filters
- Filter attributes
- Concurrency Model
- Built-in caching options
- Built-in profiling
- Messaging and Redis
- Form Hijacking Prevention
- Auto-Mapping
- HTTP Utils
- Virtual File System
- Config API
- Physical Project Structure
- Modularizing Services
- Plugins
- Tests
- Other Languages
- Use Cases
- Performance
- How To
- Future