2012-04-22 57 views
2

我在擴展基於MVC 3在類庫與ASP.NET MVC 3

基本上是一個解決方案的過程中,該解決方案由一個MVC 3項目的一些類庫項目一起使用MEF管理業務/數據訪問。

我試圖使用MEF來使應用程序插件爲基礎。例如,我在dll項目一UserManager類和我定義我的插件如下:

[ImportMany]public List<IUserHooks> Plugins {get; set;} 
foreach (var plugin in Plugins) 
{ 
    Plugin.DoTheJob(); 
} 

正如你所看到的,這個類是從MVC項目和控制器分離。該列表被定義爲我的UserManager類。

我知道最好的辦法是讓UserManager使用MEF以及(可能在控制器的構造函數像public MainController(IUserManager UserManager)初始化),但因爲我只是想添加插件支持的解決方案,而不是從頭開始寫,我喜歡最快的捷徑。

我應該如何定義我的MEF container對象才能夠在我的類庫中使用它。是否有必要使用MEF來製作MVC應用程序?我更喜歡對MVC應用程序進行最小修改的方法。

回答

2

MVC3已經支持服務位置。如果您不想重新定義某些基類,但只想擴展,則可以添加使用MEF的IDependencyResolver的實例。這樣你可以用它作爲擴展應用程序的基礎。我在my blog上寫了一個例子。

使用MVC3的內置架構,您可以在啓動時配置CompositionContainer,並將其展示給其餘的基礎架構。

但是,實際情況是,您可能不希望將您的容器暴露在您的庫中。事實上,你應該做的唯一事情就是簡單地標出你的出口。你可以用MEF逃脫這個原因是因爲它包含在.NET 4.0的BCL中。通過不將你的類耦合到MEF(或者事實上,將你的類耦合到服務定位器或反轉控制容器),它使你的代碼更加便攜,可測試和解耦。

+0

感謝您的回答馬修。我試圖測試您的解決方案,並添加了一個簡單的導入和導出TestDll項目。但具有「導入」屬性的屬性始終爲空。是否有任何額外的步驟,我應該能夠使用您的框架作爲基地,或者我應該能夠引用我的dll與導入/導出並使用它們?你有什麼想法我做錯了嗎?謝謝。 – Kamyar 2012-04-23 08:23:43