2

Asp.net MVC 2 のプラグイン システムに取り組んでいます。埋め込みリソースとしてコントローラーとビューを含む dll があります。

StructureMap を使用してコントローラーのプラグイン dll をスキャンし、要求に応じてそれらを取り出してインスタンス化できます。これはうまくいきます。次に、この投稿から適応した VirtualPathProvider があります

public class AssemblyResourceProvider : VirtualPathProvider
{
    protected virtual string WidgetDirectory
    {
        get 
        { 
            return "~/bin";
        }
    }

    private bool IsAppResourcePath(string virtualPath)
    {
        var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
        return checkPath.StartsWith(WidgetDirectory, StringComparison.InvariantCultureIgnoreCase);
    }

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

    public override VirtualFile GetFile(string virtualPath)
    {
        return IsAppResourcePath(virtualPath) ? new AssemblyResourceVirtualFile(virtualPath) : base.GetFile(virtualPath);
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies,
                                                       DateTime utcStart)
    {
        return IsAppResourcePath(virtualPath) ? null : base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
}

internal class AssemblyResourceVirtualFile : VirtualFile
{
    private readonly string path;

    public AssemblyResourceVirtualFile(string virtualPath)
        : base(virtualPath)
    {
        path = VirtualPathUtility.ToAppRelative(virtualPath);
    }

    public override Stream Open()
    {
        var parts = path.Split('/');
        var resourceName = Path.GetFileName(path);

        var apath = HttpContext.Current.Server.MapPath(Path.GetDirectoryName(path));
        var assembly = Assembly.LoadFile(apath);
        return assembly != null ? assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().SingleOrDefault(s => string.Compare(s, resourceName, true) == 0)) : null;
    }
}

VPP も正常に動作しているようです。ビューが見つかり、ストリームに引き出されます。Could not load type 'System.Web.Mvc.ViewUserControl<dynamic>'.次に、プラグ可能なビューの前の例で言及されていない解析エラーを受け取ります。この段階でビューがコンパイルされないのはなぜですか?

助けてくれてありがとう、

イアン

編集:

答えに近づいていますが、コンパイルされていない理由がはっきりしていません。バージョンを確認したコメントに基づいて、すべてが V2 にあり、V2 で動的が導入されたと信じているので、これで問題ありません。V3すらインストールしていないので、そうではありません。<dynamic>ただし、完全に削除すると、レンダリングするビューが得られます。

したがって、VPP は機能しますが、ビューが厳密に型指定されていない場合や動的でない場合に限られます

これは、型が動的に読み込まれる dll にあるため、厳密に型指定されたシナリオでは意味があるため、dll がビンにある場合でも、viewengine はそれを認識しません。アプリの起動時に型をロードする方法はありますか? オーダーメイドの Structuremap ソリューションではなく、MEF を使用することを検討しています。どう思いますか?

4

3 に答える 3

2

強く型付けされたビューの解析を可能にする設定は、〜/ Views/Web.Configにあります。ビューエンジンが仮想パスプロバイダーを使用している場合、それはビューフォルダーにないため、これらの設定は読み込まれません。

Views / Web.ConfigのページノードのすべてをルートWeb.Configにコピーすると、強く型付けされたビューが正しく解析されます。

于 2011-01-01T09:41:54.140 に答える
1

たとえば、〜/ page / xxxのような仮想パスを処理するために、Views/Web.configのコンテンツを特定の場所のメインweb.configに直接追加してみてください。詳細については、こちらをご覧ください:http: //blog.sergkazakov.com/2011/01/aspnet-strongly-typed-view-and-virtual.html

于 2011-01-17T11:40:49.513 に答える