2009-06-02 52 views
1

我已經編寫了一個ASP MVC應用程序的插件解決方案基於本網站上的建議,但是,我已經到了一個障礙,並希望得到一些幫助。不用太深入瞭解插件系統的工作原理,它會成功加載控制器並找到適當的視圖 - 問題在於視圖無法編譯,因爲它無法解析所有插件的引用(插件DLL引用了其他主機應用程序不知道的DLL)。添加引用到ASP MVC頁面編譯引擎

我在CurrentDomain上使用AssemblyResolve,但在默認BuildManager編譯視圖時未調用,而是從web.config部分獲取程序集列表。如果我將所有插件文件添加到GAC並在該部分中添加引用 - 它工作正常。但是,如果我必須爲每個插件更改web.config,那麼這會破壞擁有插件系統的目的。

小插圖來解釋這個問題: Plugin.dll --references - > PluginServices.dll

URL http://mysite.com/some/index MVC應用--load - > Plugin.dll PASS

MVC應用程序--load - > Plugin.SomeController PASS

MVC應用--find - >插件\視圖\一些\的Index.aspx PASS

MVC應用--compile - >的Index.aspx FAIL(第e查看使用來自PluginServices的一種無法找到的類型)

有沒有一種方法可以動態地添加對BuildManager的引用,以便編譯通過而不會改變web.config?

在此先感謝!

回答

0

同樣,直接加載邏輯的部分工作正常,也定位的看法,只是不工作的部分是一部分,我沒有控制 - 這是頁面的實際渲染。

但是,我確實做到了。我不得不做的是以下幾點: 1)有插件的DLL在GAC

2)下的「編輯」添加到DLL的宿主的web.config文件的引用註冊部分

3)確保插件中的所有視圖不使用'inherit'屬性來強制輸入視圖,而是創建一個局部變量並將模型轉換爲適當的類型。

這一切似乎現在工作良好,但我會繼續思考它,看看我是否能想出一個更好的解決方案。

再次,我不確定任何人都可以聲稱他們有一個MVC插件系統,並沒有處理一個簡單的view.aspx,其中有一行:<%= Model.Name%>其中Model是一個對象主持人確實知道。

再次感謝您的答案!

0

您需要考慮創建一些接口或抽象類(最好是接口),以便當插件不存在時基礎應用程序仍然可以編譯。然後,您可以在插件中編寫接口或基類的實現。

This article會讓你開始。

+0

感謝您的回覆,但這並沒有真正的工作,因爲問題是當ASP試圖實際呈現頁面並解析引用時,它無法找到關聯的DLL。 – Gil 2009-06-04 00:09:57

+0

如果您沒有可用插件接口的實現(即使它只是一個存根或單元測試模擬),您如何期望應用程序運行? – 2009-06-04 01:23:53

+0

該實現是在運行時交付給插件的另一個程序集。插件只知道它使用的對象的接口,以及服務層在運行時使用真實對象的子接口。問題是當主機應用程序在插件中呈現視圖時,它無法解析接口名稱。 – Gil 2009-06-04 02:18:57

0

我想你不想讓你的主機項目編譯插件DLL。我想你希望事先構建插件,並且可能將視圖嵌入到程序集dll中 - 這樣,您可以創建適當的接口[Robert Harvey et-al],並讓主機應用程序依靠動態加載大會是好的。也許你還需要創建一個插件線束解決方案,其中你(單元?)測試插件的開發/編譯 - 這似乎是必要的,因爲視圖中的一些編譯錯誤不會立即顯示(this post也應該幫助編譯器在視圖中的錯誤 - 它爲我工作)。

0

Gil,

看看下面的文章。它解釋瞭如何使用Reflection在運行時獲取有關業務層彙編的信息,然後使用InvokeMember調用所需的方法。它不需要任何種類的註冊工作;你只需要一個路徑到你的程序集。

C#反思與動態方法調用
http://my.execpc.com/~gopalan/dotnet/reflection.html