Warum ist MVC4 mit dem Service Locator Anti-Pattern?
Nach der Lektüre "Dependency Injection in .NET" von Mark Seemann ich bleiben Weg von der Service Locator das ist ein anti-pattern.
Beim Lesen die release notes auf MVC 4 ich sehe:
Verbesserte Inversion of Control (IoC) über DependencyResolver: Web-API
jetzt verwendet das service locator Muster implementiert, indem MVC die Abhängigkeit
resolver erhalten Sie Instanzen für viele verschiedene Einrichtungen.
So, ich bin gelassen, neugierig und verwirrt, warum Microsoft mit einem service-locator in 2012.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist eine Implementierung detail, dass Sie sollten nicht zu kümmern. Das wichtigste ist, dass jetzt, dass der Web-API verwendet die DependencyResolver zu Abhängigkeiten auflösen für viele verschiedene Einrichtungen, Sie werden in der Lage sein zu verwenden real dependency injection, Wann immer Sie wollen, stecken Sie in diese Einrichtungen. Also in deinem code werden Sie mit einem echten dependency injection. Wenn Microsoft nicht verwenden die
DependencyResolver
dann hätte es man muss es benutzt haben (als service locator anti-pattern) im code, um Abhängigkeiten aufzulösen, wenn Sie möchten, implementieren Sie benutzerdefinierte Funktionalität. Dies hätte schlecht für Sie. Jetzt ist es schlecht für Microsoft aber Sie kümmern sich nicht über Sie.Weil die Gestaltung eines Rahmens ist nicht das gleiche wie eine Anwendung entwickeln, die mit einem Rahmen. Es gibt einige verschiedene Dinge zu berücksichtigen, wenn Sie entwerfen ein wiederverwendbares framework wie ASP.NET MVC, anstatt nur das, was in den Büchern geschrieben steht. Ein Beispiel ist die Gestaltung der Rahmenbedingungen in einer Weise, dass eine person mit diesem Rahmen wird in der Lage sein, um die Vorteile der best practices in den Büchern geschrieben steht in seinem code die Verwendung dieses framework.
there's no solution to the problem of bad developers
. Und da reden wir über den Service-Locator-Muster und die Entwickler, das diese Muster geschehen, um diejenigen, die entworfen, die ASP.NET MVC-framework ich bin irgendwie bei der Ankunft am Schluss, dass Sie sind andeutend, dass schlechte Entwickler dieses framework (eigentlich die Architekten, wie Sie diese Art von design-Entscheidungen).Als Darin darauf hin, ASP.NET MVC 4 Framework und container Agnostiker. Das ist, warum Sie bietet einen service locator in form von
IDependencyResolver
. Dies erlaubt jedem, den plug in Ihrem container der Wahl.Aber ich würde nicht nennen dies ein anti-pattern. Dies ermöglicht die Verwendung der container Ihrer Wahl, aber es nicht zwingen, Sie der Entwickler der Anwendung zu benutzen service-Standort. Wenn die Rahmenbedingungen gezwungen, die Entwickler zur Nutzung von Service-Lage, dann würde ich sagen, ein anti-pattern. Aber der Entwickler baut ein ASP.NET MVC-Anwendung ist kostenlos zu benutzen DI via constructor-injection, property setup-oder service-Standort. Es ist Ihre Wahl.
Blick auf all die ASP.NET MVC-Beispiele für dependency injection veröffentlicht, die von mir oder die ASP.NET MVC-team. In so ziemlich allen Fällen sind Sie mit constructor injection. Sie sind nicht mit service-Standort.
In der Tat, die meisten der ASP.NET MVC-source-code selbst nicht verwenden-service Speicherort zum abrufen von Abhängigkeiten. Es gibt ein paar wichtige Orte, wo das MVC-Aufrufe an den service locator für legacy-APIs und so. Aber das ist über es.