虚拟路径提供程序,嵌入式资源Asp.Net MVC作为类库

时间:2016-12-21 05:08:15

标签: asp.net-mvc class-library virtualpathprovider

我需要将整个mvc结构分离到类库中。但在分离之后,必须实现虚拟路径提供程序,以便将dll中的视图作为嵌入资源。我有多个dll,我需要从中获取路径。混淆如何使用提供程序代码从多个程序集中实现相同的功能。以下是我的虚拟路径提供程序的代码。

 public class EmbeddedVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
    {
        public EmbeddedVirtualPathProvider()
        {

        }

        private bool IsEmbeddedResourcePath(string virtualPath)
        {
            var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
            return checkPath.StartsWith("~/Succeed.Web/", StringComparison.InvariantCultureIgnoreCase);
        }

        public override bool FileExists(string virtualPath)
        {
            return IsEmbeddedResourcePath(virtualPath) || base.FileExists(virtualPath);
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            if (IsEmbeddedResourcePath(virtualPath))
            {
                return new EmbeddedVirtualFile(virtualPath);
            }
            else
            {
                return base.GetFile(virtualPath);
            }
        }

        public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            if (IsEmbeddedResourcePath(virtualPath))
            {
                return null;
            }
            else
            {
                return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
            }
        }
    }

我的虚拟文件

public class EmbeddedVirtualFile : VirtualFile
    {
        private string m_path;

        public EmbeddedVirtualFile(string virtualPath)
            : base(virtualPath)
        {
            m_path = VirtualPathUtility.ToAppRelative(virtualPath);
        }

        public override System.IO.Stream Open()
        {
            var parts = m_path.Split('/');
            var assemblyName = parts[1];
            var resourceName = parts[2];

            assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName);
            var assembly = System.Reflection.Assembly.LoadFile(assemblyName + ".dll");

            if (assembly != null)
            {
                return assembly.GetManifestResourceStream(resourceName);
            }
            return null;
        }
    }

请让我知道我哪里做错了。或任何我需要做的事情来使它工作。提前完成

0 个答案:

没有答案