2009-08-29 5 views
13

Wie würde man normalerweise eine Service-Schicht in einer MVC-Architektur implementieren? Ist es ein Objekt, das alle Anforderungen an zugrunde liegende Geschäftsobjekte bedient? Oder ist es eher ein Objekt, das verschiedene Serviceobjekte bedient, die wiederum mit Geschäftsobjekten interagieren?Implementierung einer Service-Schicht in einer MVC-Architektur

So:

  1. Controller -> Service -> getUserById() oder:

  2. Controller -> Servicemanager -> getUserService() -> getUserById()

Wenn letzterer geeigneter ist, würden Sie dieses ServiceManager-Objekt in einem Bootstrap konfigurieren? Mit anderen Worten: Registrieren Sie die verschiedenen Dienste, die Sie für Ihre App benötigen, beim Service-Manager in einem Bootstrap?

Wenn keine der obigen Aussagen zutrifft, was würde mir helfen, besser zu verstehen, wie eine Service-Schicht implementiert werden sollte?

Vielen Dank im Voraus.

Antwort

4

Die Art, wie ich diese Frage lese, gibt es wirklich zwei Dinge, die sein sollten geantwortet:

A) Ich würde es vorziehen, "Service" in "CustomerService" und "OrderService" aufzuteilen, also gruppiert nach Domänenkonzepten.

B) Zweitens würde ich Dependency Injection verwenden, um den richtigen Service direkt dort zu bekommen, wo ich es brauche, also benutze ich grundsätzlich alt 1. Die zusätzliche Abstraktion in Alternative 2 bietet keinen zusätzlichen Wert für mich, seit dem IoC-Container macht den wichtigen Teil.

+0

Vielen Dank für Ihre Antwort krosenvold. In Bezug auf Sie Antwort: A) Verstanden und vereinbart B) Ich sehe, was Sie über die redundante Abstraktion sagen. Aber wie ich zu Joel gesagt habe: Es fällt mir schwer zu begreifen, wie IoC in einer MVC-Umgebung implementiert werden würde. Wo würde das stattfinden? In der Steuerung? Wie bietet dies zusätzlichen Wert? Ich glaube nicht, dass ich das Prinzip von IoC zu gut verstehe, um seine Vorteile zu begreifen. Oder reden wir darüber, es in einem Bootstrap zu konfigurieren? Wenn du es (vielleicht mit einem kurzen Beispiel) ausarbeiten möchtest, würde ich es sehr schätzen. Vielen Dank. –

+0

Das Schlüsselkonzept zum Verständnis der Abhängigkeitsinjektion ist, dass es an den meisten Orten verwendet wird, um effektiv zu sein. Normalerweise haken Sie den IoC-Container auf einem sehr niedrigen Infrastrukturniveau ein und er dringt nur überall durch. – krosenvold

2

Ich persönlich bevorzuge # 2, und ja, es würde in der Regel in einem Bootstrap konfiguriert werden, oder die Abhängigkeiten würden mit einer Art von IoC-Container aufgelöst werden, um Ihnen die tatsächlichen konkreten Instanzen.

Ich würde auch gerne kommentieren, und ja, ich verstehe das ist wahrscheinlich eher eine persönliche Vorliebe. Versuchen Sie zu vermeiden, den Namen "Service" -Layer für diese Objekte zu verwenden. bezeichnen sie als Repositories oder etwas anderes. Wenn Sie den Dienst benutzen, wird dieser Begriff überladen ... weil dann Devs wie sind, "meinst du wie, ein Rest oder WCF Service?". Vertrauen Sie mir, wir haben das mit einem kürzlichen Projekt gemacht, und wir verwirren uns die ganze Zeit, wenn wir darüber reden, wo man Codeänderungen vornehmen kann :-P

+0

Joel, vielen Dank für Ihre Antwort. Ich stimme Ihrem Einwand, den Service zu nennen, zu. Ich habe das gerade aufgegriffen, aber ich habe es selbst ein wenig verpönt. Aber das Konzept der Schicht hat mich angesprochen. Ich versuche, das ganze Konzept der Abhängigkeitsinjektion auch in diesem Moment zu erfassen, aber mir ist nicht ganz klar, wie das funktioniert. Können Sie ein kurzes Beispiel dafür geben, wie dies in einer MVC-Umgebung funktioniert? Ich meine, wo würden Sie injizieren, was in object, wenn zum Beispiel retreiving User Objekte sprechen? Es fällt mir schwer, dieses Konzept zu verstehen. Vielen Dank im Voraus. –

+0

vertrauen Sie mir, wenn ich sage, dass ich verstehe, wenn Sie sagen, dass Sie versuchen, Ihren Kopf um ioc zu wickeln. Ich brauchte ein wenig um herauszufinden, wann/wo ich es verwenden sollte :-) Diese Kommentarbox ist zu klein, um wirklich darauf einzugehen, aber ich würde vorschlagen, die ninject lib (http://ninject.org/) auszuprobieren.Ihre Tutorials gehen Schritt für Schritt durch und beginnen mit der Einführung der Konzepte. zusammenzufassen, es geht darum, die API von der konkreten Implementierung zu trennen. Ihr Code im MVC-Projekt sollte gegen Ihre API arbeiten, nicht an Ihren spezifischen Implementierungen .... auf diese Weise können Sie sie später beim Komponententest ändern –

+3

Laut Martin Fowler definiert eine Service-Schicht "die Grenze einer Anwendung mit einer Schicht von Diensten, die etabliert Eine Reihe verfügbarer Operationen "Bei den biz-Apps sind diese Operationen normalerweise CRUD, aber nicht immer. Ich denke also nicht, dass service layer = repository ist. Wie eine echte Service-Schicht (die ich liebe) in MVC passt, ist mir immer noch ein Rätsel. Mein Bauchgefühl ist, dass das M in MVC durch ein S ersetzt werden sollte. Wenn die Controller nicht die Serviceebene bilden, von der ich spreche? Ich denke, so machen es die meisten Leute. Aber sollten die Controller die Anwendungsgrenzen definieren? Ich bin verwirrt ... –

Verwandte Themen