/// <summary>
        /// 
        /// </summary>
        /// <param name="appHost"></param>
        public void Register(IAppHost appHost)
        {
            var inMemoryProvider = new RecursiveInMemoryVirtualPathProvider(appHost);
            // Create a "Views" directory for dumping all our discovered views in
            var viewsDir = new InMemoryVirtualDirectory(inMemoryProvider, inMemoryProvider.rootDirectory)
            {
                DirName = "Views",
                files = new List<InMemoryVirtualFile>(),
                dirs = new List<InMemoryVirtualDirectory>()
            };
            inMemoryProvider.rootDirectory.dirs.Add(viewsDir);

            foreach (var asm in _assemblies)
            {
                foreach (string resource in asm.GetManifestResourceNames())
                {
                        // Get just the file name. Internally, ServiceStack dumps all these in a giant "/Views" directory anyway, so let's just do that.
                        string path = string.Join(".", resource.Split('.').Reverse().Take(2).Reverse());
                        viewsDir.AddFile(path, new StreamReader(asm.GetManifestResourceStream(resource)).ReadToEnd());
                }
            }

            var razorPlugin = new RazorFormat
            {
                VirtualPathProvider = inMemoryProvider,
                EnableLiveReload = false
            };

            appHost.LoadPlugin(razorPlugin);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="EmbeddedResourceVirtualPathProvider"/> class.
 /// </summary>
 /// <param name="appHost"></param>
 public EmbeddedResourceVirtualPathProvider(IAppHost appHost) : base(appHost)
 {
     _root = new InMemoryVirtualDirectory(this)
     {
         FlattenFileEnumeration = false
     };
     _assemblies = new List <Assembly>();
 }
        /// <summary>
        /// Populates the root directory from embedded resources.
        /// </summary>
        public void PopulateFromEmbeddedResources()
        {
            _root = new InMemoryVirtualDirectory(this)
            {
                FlattenFileEnumeration = false
            };
            foreach (var assembly in _assemblies)
            {
                string baseName = assembly.GetName().Name + ".";

                foreach (var resource in assembly.GetManifestResourceNames())
                {
                    // Most embedded resources will start with the assembly name (e.g. Foo.txt in Bar.dll will be named Bar.Foo.txt by default)
                    // Strip that assembly name off if it's set
                    string relativeName = resource;
                    if (relativeName.StartsWith(baseName))
                    {
                        relativeName = relativeName.Remove(0, baseName.Length);
                    }

                    string   fileName;
                    string[] directoryStructure;
                    // Figure out which portion of the path represents the file name, and what directory structure it's in (if any)
                    InferFileNameAndDirectoryPath(relativeName, out fileName, out directoryStructure);

                    // Loop over the directory structure to figure out which directory this file is supposed to go in
                    InMemoryVirtualDirectory destinationDirectory = _root;
                    foreach (var directory in directoryStructure)
                    {
                        var nextLevel = (InMemoryVirtualDirectory)destinationDirectory.GetDirectory(directory);
                        // If our expected directory doesn't exist, add it
                        if (nextLevel == null)
                        {
                            nextLevel = new InMemoryVirtualDirectory(this, destinationDirectory)
                            {
                                FlattenFileEnumeration = false, DirName = directory
                            };
                            destinationDirectory.dirs.Add(nextLevel);
                        }
                        destinationDirectory = nextLevel;
                    }
                    var file = new StreamBasedVirtualFile(this, destinationDirectory, assembly.GetManifestResourceStream(resource), fileName, DateTime.Now);

                    // Give people the opportunity to exclude this file
                    if (FileExcluder != null && FileExcluder(file))
                    {
                        continue;
                    }

                    destinationDirectory.files.Add(file);
                }
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="EmbeddedResourceVirtualPathProvider"/> class.
 /// </summary>
 /// <param name="appHost"></param>
 public EmbeddedResourceVirtualPathProvider(IAppHost appHost) : base(appHost)
 {
     _root = new InMemoryVirtualDirectory(this){FlattenFileEnumeration = false};
     _assemblies = new List<Assembly>();
 }
        /// <summary>
        /// Populates the root directory from embedded resources.
        /// </summary>
        public void PopulateFromEmbeddedResources()
        {
            _root = new InMemoryVirtualDirectory(this) { FlattenFileEnumeration = false };
            foreach (var assembly in _assemblies)
            {
                string baseName = assembly.GetName().Name + ".";

                foreach (var resource in assembly.GetManifestResourceNames())
                {
                    // Most embedded resources will start with the assembly name (e.g. Foo.txt in Bar.dll will be named Bar.Foo.txt by default)
                    // Strip that assembly name off if it's set
                    string relativeName = resource;
                    if (relativeName.StartsWith(baseName))
                    {
                        relativeName = relativeName.Remove(0, baseName.Length);
                    }

                    string fileName;
                    string[] directoryStructure;
                    // Figure out which portion of the path represents the file name, and what directory structure it's in (if any)
                    InferFileNameAndDirectoryPath(relativeName, out fileName, out directoryStructure);

                    // Loop over the directory structure to figure out which directory this file is supposed to go in
                    InMemoryVirtualDirectory destinationDirectory = _root;
                    foreach (var directory in directoryStructure)
                    {
                        var nextLevel = (InMemoryVirtualDirectory) destinationDirectory.GetDirectory(directory);
                        // If our expected directory doesn't exist, add it
                        if (nextLevel == null)
                        {
                            nextLevel = new InMemoryVirtualDirectory(this, destinationDirectory) {FlattenFileEnumeration = false, DirName = directory};
                            destinationDirectory.dirs.Add(nextLevel);
                        }
                        destinationDirectory = nextLevel;
                    }
                    var file = new StreamBasedVirtualFile(this, destinationDirectory, assembly.GetManifestResourceStream(resource), fileName, DateTime.Now);

                    // Give people the opportunity to exclude this file
                    if (FileExcluder != null && FileExcluder(file))
                    {
                        continue;
                    }

                    destinationDirectory.files.Add(file);
                }
            }
        }