Встроенные виды бритвы - PullRequest
4 голосов
/ 07 июля 2011

Недавно я прочитал пост , где автор описывает, как мы можем компилировать виды бритв в отдельные библиотеки. Я хотел бы спросить, возможно ли встраивать представления в библиотеки без компиляции? Затем добавьте пользовательский VirtualPathProvider для чтения представлений.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2013

Вы можете использовать мой EmbeddedResourceVirtualPathProvider , который можно установить через Nuget.Он загружает ресурсы из ссылочных сборок, а также может быть настроен на получение зависимостей от исходных файлов во время разработки, чтобы вы могли обновлять представления без перекомпиляции.

1 голос
/ 02 мая 2012

В вашей «оболочке» MVC проекта Global.asax Application_Start зарегистрируйте свой пользовательский VirtualPathProvider:

HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider());

Реальная реализация будет более сложной, чем эта, потому что вы, скорее всего, сделаете некоторую основанную на интерфейсе рефлексию базы данных.поиск и т. д. в качестве средства извлечения метаданных, но это было бы общей идеей (предположим, что у вас есть другой проект MVC с именем "AnotherMvcAssembly" с контроллером Foo, а представление Index.cshtml помечено как встроенный ресурс:

public class CustomVirtualPathProvider : VirtualPathProvider {
    public override bool DirectoryExists(string virtualDir) {
        return base.DirectoryExists(virtualDir);
    }

    public override bool FileExists(string virtualPath) {
        if (virtualPath == "/Views/Foo/Index.cshtml") {
            return true;
        }
        else {
            return base.FileExists(virtualPath);
        }
    }

    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) {
        if (virtualPath == "/Views/Foo/Index.cshtml") {
            Assembly asm = Assembly.Load("AnotherMvcAssembly");
            return new CacheDependency(asm.Location);
        }
        else {
            return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
    }

    public override string GetCacheKey(string virtualPath) {
        return base.GetCacheKey(virtualPath);
    }

    public override VirtualDirectory GetDirectory(string virtualDir) {
        return base.GetDirectory(virtualDir);
    }

    public override VirtualFile GetFile(string virtualPath) {
        if (virtualPath == "/Views/Foo/Index.cshtml") {
            return new CustomVirtualFile(virtualPath);
        }
        else {
            return base.GetFile(virtualPath);
        }
    }
}

public class CustomVirtualFile : VirtualFile {
    public CustomVirtualFile(string virtualPath) : base(virtualPath) { }

    public override System.IO.Stream Open() {
        Assembly asm = Assembly.Load("AnotherMvcAssembly");
        return asm.GetManifestResourceStream("AnotherMvcAssembly.Views.Foo.Index.cshtml");
    }
}
...