2009-08-22 4 views
1

Ich habe eine asp.net-Anwendung mit einer Modellbaugruppe (mit einer Model-Klasse) für Business-Logik. Diese Modellassembly hängt über eine IMailService-Schnittstelle von einem MailService ab, und ich versuche, MEF zu verwenden, um die für eine MailService-Implementierung erforderlichen Modelle zu füllen. Ich mache die MEF-Komposition im Konstruktor der Model-Klasse.Mef und asp.net Problem

Die Idee dahinter ist, eine MailService-Assembly zu erstellen, die ich zwischen meinen Websites wiederverwenden kann, ohne dass die Websites selbst wissen müssen, wie die Mail gesendet wird. Vielleicht wäre ein IoC-Container eine bessere Wahl, aber ich denke einfach, dass der MEF-Ansatz einfacher zu verstehen ist und ich mag die Idee, meine Apps durch die Kombination von Teilen zu komponieren. Hat der Mef-Ansatz auch negative Seiten, wenn Sie ihn mit einem IoC-Container vergleichen?

[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); 
} 

Der folgende Code ist eine andere in der Montage und die Schnittstelle noch in einer anderen Baugruppe

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

dies in meinen Unit-Tests für die Modellanordnung funktioniert gut, aber wenn ich das Modell Montag durch meine asp bin mit .net Website schlägt mit der Ausnahme unten fehl. Ich habe auch versucht, das Vertrauen zu voll in web.config, aber immer noch kein Glück

Die Zusammensetzung bleibt unverändert. Die Änderungen wurden wegen der folgenden Fehler ( ) zurückgewiesen: Die Zusammensetzung erzeugt einen einzelnen Kompositionsfehler. Die Ursache ist unten angegeben. Überprüfen Sie die CompositionException.Errors Eigenschaft für detailliertere Informationen .

1) Es wurden keine Exporte ‚Das Spiel die Einschränkung gefunden ((exportDefinition.ContractName = "ExtensionInterfaces.IMailService") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & & „ExtensionInterfaces .IMailService ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) '.

in Resultierende: Kann nicht eingestellt Import Model.Model._mailService (ContractName = "ExtensionInterfaces.IMailService") ' auf Teil Model.Model'. Element: Model.Model._mailService (ContractName = "ExtensionInterfaces.IMailService") -> Model.Model

Antwort

1

ich nicht MEF in einer Web-Anwendung noch verwendet habe, aber wenn ich mich zu erraten war würde annehmen, dass es ein Problem mit dem Lesen der Assemblys im Plugins-Verzeichnis gibt. Vielleicht ein Berechtigungsproblem oder etwas. Jedenfalls würde ich damit beginnen, DirectoryCatalog zu untersuchen, um zu sehen, ob es das enthält, was Sie erwarten würden.

+0

Ich vermutete auch, dass ich jedem vollen Zugriff auf diesen Ordner gab, legte die Website auf volles Vertrauen. Ich habe sogar den Plugins-Ordner innerhalb der Website verschoben, aber immer noch kein Glück. – terjetyl

+0

Auch der Komponententest, der diesen spezifischen Code aufruft, funktioniert gut, also ist es ein Problem, das auftritt, wenn ein Asp verwendet wird.Net Site als Client – terjetyl

1

Ich habe den Fehler gefunden, ich hatte eine Assembly im bin-Ordner mit dem gleichen Namen wie die MailService-Assembly mit meinem Export. Aus irgendeinem Grund hat der Katalog die Assembly im Ordner bin statt in der Assembly im angegebenen Katalog abgeholt. Ich weiß nicht warum, aber es funktionierte, als ich die alte Baugruppe aus dem Ordner "bin" entfernte.

+1

Es hätte möglicherweise entstehen können, wenn die alte Assembly in den Prozess geladen wurde und die alte und neue Assembly die exakt gleiche Identität (d. h. Assemblyname, Version, Schlüssel, etc) haben. Das DirectoryCatalog führt einfach ein Assembly.Load (AssemblyName) aus, und wenn die Assembly mit derselben Identität bereits in der AppDomain geladen ist, wird einfach die bereits geladene Assembly verwendet, anstatt die neue Assembly zu laden, auch wenn sie anderen Code enthält. –