0

Ich begann gerade erst, mich mit MVC anzufreunden, als mir jemand IoC-Container erwähnte, und jetzt fühle ich mich, als wäre ich ein paar tausend Fuß gefallen und muss wieder hochklettern. Ich war versucht, sie einfach zu ignorieren, aber dann las ich den Component Lifestyle. Dies scheint eine große Sache für mich zu sein, wie erklärt, kann nicht übernommen Änderungen an Datenbank-Updates über Anfragen Leck, wenn meine Repositories Lifestyle auf Singleton anstelle von PerWebRequest gesetzt ist.MVC IoC Komponente Lifestyle PerWebRequest

Also meine Frage ... gibt es eine Möglichkeit, die Komponente Lifestyle Affekt ohne Verwendung von IoC-Containern zu erstellen, oder ist das die einzige Option?

Antwort

0

Sie können eine Implementierung immer als Singleton erstellen. Wenn ich jedoch über ein Repository spreche, denke ich nicht, dass es ein Bedürfnis gibt. Dies ist jedoch nicht der eigentliche Zweck, einen IoC zu verwenden. Die Verwendung des IoC entkoppelt den Benutzer Ihres Codes von der Implementierung selbst. Es erleichtert das Testen, da Sie Dinge ein- und auslagern können. Auch in meinem Fall finde ich es sehr nützlich für andere Zwecke. Nehmen Sie zum Beispiel Caching. In meinem lokalen Entwickler verwende ich Lucene.NET, um meine Cache-Implementierung mit einem diskettenbasierten Cache zu versehen. Wenn ich dann zu meinen Entwicklungs- und Staging-Plattformen dränge, benutze ich die standardmäßige .net-Cache-Implementierung. Wenn ich dann zur Produktion gehe, kann ich eine Velocity- oder MemCached-Implementierung verwenden. Ich muss nichts Besonderes machen, um von Punkt A nach Punkt B zu kommen, da ich StructureMap (meinen bevorzugten IoC-Container) verwende.

Es scheint, dass Component Lifestyle eher eine Designentscheidung als eine IoC-Entscheidung ist. Alle drei hier genannten Methoden zum Verwalten der Lebensdauer eines Objekts können ohne IoC durchgeführt werden ... aber das könnte (in einigen Fällen) ein interessanter Nebeneffekt eines IoC sein.

+1

Danke ... Entkopplung meines Codes ist * nett * aber nicht wichtig für mich zu dieser Zeit. Die Integrität der Daten über Anfragen hinweg ist jedoch entscheidend - und mein Anliegen ist, dass ich meine App ohne IoC irgendwie für potenzielle Korruptionsprobleme öffne. (HINWEIS: Ich muss noch eine echte App mit MVC implementieren - nur vier oder fünf Demo-Apps. Ich habe gerade zwei Bücher über das Thema gelesen - und der IoC-Container Betreff hat mich für eine Schleife geworfen) – dizzyguy

+0

"Ihr * SqlProductsRepository "Derzeit gibt es diesen Singleton-Lifestyle, so dass Sie nur einen einzelnen LINQ zu SQL * DataContext * am Leben erhalten, solange Ihre App läuft und sie für alle Anfragen freigibt. Das scheint in Ordnung zu sein ... denn bisher ist der gesamte Datenzugriff schreibgeschützt, aber es würde zu Problemen führen, wenn Sie mit dem Bearbeiten von Daten beginnen. Nicht festgeschriebene Änderungen würden über die Anfragen hinaus führen. "- Pro ASP.NET MVC Framework, S. 101 – dizzyguy

+0

Wenn Sie eine Instanz Ihres Datenkontexts in einem Controller oder einem Service instanziieren und diese in Ihr Repository oder Ihre Repositorys für diese Transaktion" injizieren ". ... dann call commit ... und dann totzuschlagen, dass der Datenkontext "in Ordnung" sein sollte. Ich lasse meinen datacontext niemals während des gesamten Lebenszyklus einer Anwendung offen. Er liegt außerhalb des Bereichs einer Transaktion. ..die ich für einen sicheren Weg hielt. –