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 を使用することを検討しています。どう思いますか?