1)我不建議讓你的視圖直接使用外部引用或動態加載的外部引用。通過讓您的視圖與控制器進行交互來摘要。讓你的控制器向你的視圖提供一個數據對象,這個數據對象是你的應用程序在構建時已知的(換句話說,在構建時你的web應用程序已知的對象)。這是爲了從您的角度完全隔離(抽象)插件特定的業務。然後讓你的控制器與「插件」進行交互。
2)我不知道你的「定製工廠」是如何工作的,但是現在我們不再真的建立任何「定製工廠」了。相反,我們利用依賴注入容器,如Microsoft Unity(或Ninject,或Castle Windsor等)。創建「自定義工廠」是非常老式的,你基本上已經通過依賴注入來重塑已經解決的問題。
3)至於動態加載外部組件,我不知道,如果你有正確的,但這裏有一個鏈接:
Dynamically load a type from an external assembly
4)通常情況下,一個插件設計暴露已知接口在構建時刻到您的主要Web應用程序。插件設計隱藏的是可以從一個插件更改爲另一個插件的實現。重要的是,每個插件都實現相同的公共接口,即主要Web應用程序所期望的接口。通常,您將在一個單獨的「Common」項目中使用這些接口,這兩個接口都由您的主Web應用程序和實現這些接口的插件引用。因此,從您的主Web應用程序中,您將知道插件的公共接口是什麼,您可以動態加載外部程序集並使用C#反射來查找實現這些接口的類並將它們加載到依賴注入容器中。同樣,任何想要爲您的Web應用程序開發插件的人都必須實現「Common」項目中定義的接口。
注意:「Common」只是我給該項目的隨機名稱。你可以將它命名爲「PluginInterface」或任何你想要的。
之後,讓控制器從依賴注入容器中抓取它所需的任何東西都是微不足道的。
注意:您的插件接口可能會有輸入和輸出實體。這些實體在您的主要Web應用程序和您的插件之間共享。在這種情況下,因爲這些實體是你的接口的一部分,所以他們需要在「Common」項目中。您可能會想要讓您的控制器直接將這些實體返回到您的視圖,但是您的視圖和插件之間不會有完美的抽象。沒有完美的抽象是另一個討論。
希望它有幫助!
我不清楚爲什麼你的要求是程序集啓動後必須加載程序集?這對於外部庫來說不是一個正常的用例。 – Claies
它類似於插件,或者考慮模塊化web應用程序,如果園cms。實際上這個程序集的視圖是在用戶給出的運行時進行的! :) –
我不認爲這是可能的,因爲當在dnx環境中使用roslyn時,動態編譯器會使用project.json作爲構建過程的一部分來解析依賴關係。您的動態加載的程序集將不會在project.json中列出,因此編譯器將會失敗。我想在理論上可以動態地調整project.json,然後在啓動之後和視圖加載之前反映新的依賴關係,但老實說,我不知道它是否會起作用,最好是黑客行爲。即使它有效,它也可能在未來破裂。 –