dependency injection - injection - Warum verwendet MVC4 den Service Locator Anti-Pattern?



inversion of control java example (2)

Nachdem ich "Dependency Injection in .NET" von Mark Seemann gelesen habe, halte ich mich vom Service Locator fern, der ein Anti-Pattern ist.

Nach dem Lesen der Release Notes auf MVC 4 sehe ich:

Verbesserte Inversion der Kontrolle (IoC) über DependencyResolver: Die Web-API verwendet nun das Servicelocator-Muster, das vom Abhängigkeits-Resolver von MVC implementiert wurde, um Instanzen für viele verschiedene Einrichtungen zu erhalten.

Daher bin ich neugierig und verwirrt, warum Microsoft 2012 einen Service Locator nutzen würde.

https://src-bin.com


Answer #1

Wie Darin hervorhebt, ist ASP.NET MVC 4 ein Framework und Container-agnostisch. Aus diesem Grund stellt es einen Service Locator in Form von IDependencyResolver . So kann jeder seinen gewünschten Container anschließen.

Ich würde dies jedoch nicht als Anti-Muster bezeichnen. Auf diese Weise können Sie den Container Ihrer Wahl verwenden. Der Anwendungsentwickler wird jedoch nicht gezwungen , den Service-Standort zu verwenden. Wenn das Framework den Entwickler gezwungen hat, den Dienststandort zu verwenden, würde ich es als Anti-Pattern bezeichnen. Aber der Entwickler, der eine ASP.NET MVC-Anwendung erstellt, kann DI über die Konstruktorinjektion, die Eigenschafteneinrichtung oder den Servicestandort verwenden. Es ist ihre Wahl.

Sehen Sie sich alle ASP.NET MVC-Beispiele für Dependency Injection an, die von mir oder dem ASP.NET MVC-Team veröffentlicht wurden. In fast allen Fällen verwenden sie die Konstruktorinjektion. Sie verwenden keinen Service-Standort.

Tatsächlich verwendet der Großteil des ASP.NET MVC-Quellcodes selbst keinen Service-Standort zum Abrufen von Abhängigkeiten. Es gibt einige Schlüsselstellen, an denen der MVC in den Service-Locator für ältere APIs und dergleichen einruft. Aber das war es schon.


Answer #2

Das ist ein Implementierungsdetail, das Sie nicht interessieren sollten. Wichtig ist, dass die Web-API jetzt DependencyResolver verwendet, um Abhängigkeiten für viele verschiedene Einrichtungen aufzulösen. Sie können dann eine echte Dependency-Injektion verwenden, wenn Sie diese Einrichtungen nutzen möchten. In Ihrem Code werden Sie also eine echte Abhängigkeitsinjektion verwenden. Wenn Microsoft den DependencyResolver nicht verwendet hat, dann hätte es Sie in Ihrem Code als Service-Locator-Anti-Pattern verwendet, um Abhängigkeiten aufzulösen, wenn Sie einige benutzerdefinierte Funktionen implementieren möchten. Das wäre schlecht für dich gewesen . Jetzt ist es schlecht für Microsoft, aber Sie interessieren sich nicht für sie.

Daher bin ich neugierig und verwirrt, warum Microsoft 2012 einen Service Locator nutzen würde.

Das Entwerfen eines Frameworks ist nicht das Gleiche wie das Entwerfen einer Anwendung mithilfe eines Frameworks. Beim Entwerfen eines wiederverwendbaren Frameworks, z. B. ASP.NET MVC, müssen verschiedene Dinge berücksichtigt werden, und nicht nur, was in den Büchern steht. Ein Beispiel ist, das Framework so zu gestalten, dass eine Person, die dieses Framework verwendet, in der Lage ist, die Best Practices zu nutzen, die in den Büchern in seinem Code mit diesem Framework geschrieben wurden.





service-locator