我正在爲使用Razor視圖的ASP.NET MVC3設計插件框架,並且我遇到了使嵌入式視圖正常工作的問題。ASP.NET MVC3和嵌入式Razor視圖的插件框架
插件框架被設計爲具有以下功能:
- 每個插件都有自己的模型,控制器和視圖。的意見是嵌入式資源,並從PluginController類派生
- 所述插件具有到共享類庫定義PluginController基類
- 承載插件的「殼」的web應用程序的依賴性的引用控制器在設計時間處不得持有對任何插件的引用,因爲它在設計時不知道它具有哪些插件。
- 發現插件(使用反射)
- 註冊:
- 插件DLL的在外殼應用程序的文件夾,這是不是/ bin文件夾
- 外殼採用的護理下降所有控制器(我正在使用Spring.Net)
- 創建路由到控制器
- 通過自定義VirtualPathProvider服務剃鬚刀文件(cshtml)
現在一切工作正常,除了當嵌入的視圖引用插件DLL中的類型。然後我得到了臭名昭著的錯誤(名字省略了):
The type or namespace name '[Plugins]' does not exist in the namespace '[MyPluginSolution]' (are you missing an assembly reference?)
這樣做的原因是,它被調用運行的CSC編譯器來編譯剃刀意見只得到bin文件夾中的dll引用和GAC。
我也嘗試過使用this technique預編譯視圖,但最終它給出了相同的結果,因爲運行時堅持編譯預編譯的剃刀視圖的包裝。
我當然可以刪除插件DLL的/ bin文件夾,但我的問題是:
是否有在非斌註冊的dll方式(和非GAC)文件夾,和治療他們是「一等公民」,所以他們可以用剃刀的意見?
是不是在插件目錄中插入插件的原因是你不希望應用程序重新啓動?此解決方案僅在應用程序啓動時加載插件(BuildManager.AddReferencedAssembly) - 是否可以在dynamicDirectory中動態引用程序集? –
原因是這個解決方案可能有大量的插件,每個插件有3-5個dll。由於您無法將它們放入/ bin下的子文件夾中,因此首選解決方案是使用另一個文件夾。 – lasseschou