2009-08-22 85 views
1

我有一個asp.net應用程序使用模型程序集(具有Model類)用於業務邏輯。此模型程序集通過IMailService接口具有對MailService的依賴關係,我試圖使用MEF來填充MailService實現的模型需求。我正在做Model類的構造器中的MEF組合。Mef和asp.net問題

這個想法背後是創建一個MailService程序集,我可以在我的網站之間重複使用,而無需網站本身需要知道郵件的發送方式。也許一個IoC容器會是一個更好的選擇,但我只是認爲MEF方法更容易理解,我喜歡通過組合部分來組合我的應用程序的想法。如果與IoC容器進行比較,mef方法是否有任何負面影響?

[Import] 
private IMailService _mailService; 

public Model() 
{ 
    Compose(); 
} 

private void Compose() 
{ 
    DirectoryCatalog cat = new DirectoryCatalog(Settings.Default.PluginsFolder); 
    var container = new CompositionContainer(cat); 
    container.ComposeParts(this); 
} 

下面的代碼是在另一個組件和接口的另一個組件

[Export(typeof(IMailService))] 
public class MailService : IMailService 
{ 
} 

能正常工作在我的單元測試的模型裝配,但是當我使用的模型裝配通過我的ASP .net網站失敗,下面的例外。我也嘗試在web.config中設置完全信任,但仍然沒有運氣

構圖保持不變。 更改因以下錯誤 而被拒絕:組合錯誤 產生了單個組合錯誤。 根本原因如下。 查看CompositionException.Errors 屬性獲取更詳細的 信息。

1)否出口中發現的匹配 約束 「((exportDefinition.ContractName = 「ExtensionInterfaces.IMailService」)& & (exportDefinition.Metadata.ContainsKey( 「ExportTypeIdentity」) & & 「ExtensionInterfaces .IMailService」 .Equals(exportDefinition.Metadata.get_Item( 「ExportTypeIdentity」))))」。

,導致:無法設置進口 Model.Model._mailService '在零件上Model.Model '(ContractName = 「ExtensionInterfaces.IMailService」)。元素: Model.Model._mailService (ContractName = 「ExtensionInterfaces.IMailService」) - > Model.Model

回答

1

我沒有用MEF在Web應用程序還,但如果我猜我會認爲讀取plugins目錄中的程序集時會出現一些問題。也許是權限問題或什麼的。無論如何,我會從檢查DirectoryCatalog開始,看看它是否包含您期望的內容。

+0

我懷疑這一點,我給每個人完全訪問該文件夾,將網站設置爲完全信任。我甚至移動了網站內的插件文件夾,但仍然沒有運氣。 – terjetyl 2009-08-24 07:12:53

+0

另外單元測試調用spesific代碼工作正常,所以它是使用asp時發生的問題。作爲客戶端的網站 – terjetyl 2009-08-24 07:19:56

1

我發現了錯誤,我在bin文件夾中有一個與MailService程序集名稱相同的程序集並導出。出於某種原因,目錄在bin文件夾中拾取了組件,而不是我指定的目錄中的組件。不知道爲什麼,但至少在我從bin文件夾中刪除舊程序集時它工作正常。

+1

如果舊程序集在程序中加載並且舊程序集和新程序集具有完全相同的標識(例如程序集名稱,版本,密鑰等),則可能會有可能發生。 DirectoryCatalog簡單地執行Assembly.Load(AssemblyName),並且如果具有相同標識的程序集已經加載到AppDomain中,它將簡單地使用已經加載的程序集,而不是加載新程序,即使它們包含不同的代碼。 – 2009-08-24 21:24:42