Ich habe den Windsor IoC Container für meine webbasierte Anwendung verwendet, um die Implementierung der Datenzugriffsebene zu lösen, die die Anwendung verwenden sollte.MEF: Wo sollte ich den CompositionContainer platzieren?
Die Benutzeroberfläche der Webanwendung besteht aus Seiten und jede Seite besteht aus kleinen Einheiten namens Portlets. (Ihr Konzept ähnelt in etwa Widgets.) Diese sogenannten Portlets sind im Grunde Web-Controls und können für jede Seite einzeln im Runtime konfiguriert werden.
Die Anwendung wird mit einigen dieser integrierten geliefert, aber ich möchte es problemlos erweitern können.
Ich fand heraus, dass dieser Mechanismus genau das ist, wofür MEF gebaut wird. Also entschied ich, das System so zu implementieren, dass es Portlets mit MEF entdeckt. Dann merkte ich, dass es auch tun kann, wofür ich Windsor momentan nutze, also habe ich beschlossen, Windsor zugunsten von MEF zu streichen.
Offensichtlich muss ich DirectoryCatalog verwenden, der nach den .dlls im Bin-Ordner der App sucht und alles zurückgibt, was ich brauche.
Ich lese einige Tutorials, Beispiele und alle Fragen bezüglich MEF in StackOverflow. Ich dachte mir, dass der einfachste Weg, MEF zu verwenden, der PartInitializer ist, den Glenn Block in seinen Tutorials erwähnt hat, aber ich habe festgestellt, dass es nicht in MEF ist. Tatsächlich ist es in dem Code, den ich von CodePlex heruntergeladen habe, aber in einer separaten Assembly und nur in der Quelle, nicht in binärer Form. (Bedeutet das, dass es kein Teil von MEF ist? Oder was ist der Sinn darin, es in ein separates Projekt zu setzen?) Dann erkannte ich, dass es für Silverlight ist, also hilft es mir nicht wirklich. (Oder sollte ich das nur gegen .NET 3.5 kompilieren, oder es in meinem Projekt einschließen, und ich bin gut zu gehen?)
So jetzt habe ich ein Problem, das folgende ist: wo sollte ich den CompositionContainer setzen in meiner Bewerbung?
Es gibt noch eine andere Sache, die ich in Betracht ziehen möchte: Soll ich nur einen CompositionContainer während der Lebensdauer der App verwenden, oder sollte ich besser einen Container für jedes Mal erstellen, wenn ich ihn brauche?