2009-12-09 12 views
15

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?

Antwort

11

Gute Fragen.

Im Allgemeinen in Bezug auf den Fragen, wo die Behälter zu setzen, empfehle ich die folgenden Beiträge: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

In der MEF im Web, Web-basierten Anwendungen sind ein bisschen tricker wegen der Anfrage/Antwort-Natur und Bedenken hinsichtlich der Skalierbarkeit. Für das Web möchten Sie wahrscheinlich eine Hierarchie von Containern haben, eine Root-Datei für die Anwendung, die gemeinsam verwendet wird, sowie untergeordnete Contianer pro Anfrage. Die Kindercontainer sollten mit der Anfrage leben und sterben, um Ressourcen zu schonen. Der freigegebene Container enthält Dienste, die von allen Anrufern gemeinsam genutzt werden.

Check-out könnte diese Artikel für mehr Aufschluss darüber, wie dies zu tun:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

Soweit PartInitializer, würde ich vermeiden so etwas wie es zu benutzen, wenn Sie zu haben. ASP.NET bietet genügend Hooks in der Pipeline durch HTTP-Handler, Module und so, um bei der Erstellung automatisch komponieren zu können.

Der einzige Ort, den ich mit PI im Web sehen würde, wäre möglicherweise in einem benutzerdefinierten Benutzersteuerelement. PI wird als Teil von Silverlight 4 ausgeliefert und ist in der Box für .NET 4.0 nicht verfügbar.Ich habe eine brauchbare Version für .NET 4.0 erstellt, die Sie hier finden: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH Glenn

Verwandte Themen