2009-08-03 9 views
1

Ich habe bei einem kleinen Design-Problem stecken.Software-Design-Problem: kreisförmige Abhängigkeit

folgende Situation

Bibliothek Schnittstelle

Enthält Schnittstelle für jede Modellklasse (Getter und Setter nur)

Libray Businnes Logic

Enthält Implementierungen von Schnittstellenbibliothek und DAL . Verwendet Schnittstelle & Transporter Bibliothek

Bibliothek Transporter: Enthält Web-Services 3rd-Party-Klassen für Messaging. Auch dort möchte ich die Referenzen oder Web-Referenzen von 3rd-Party-Bibliotheken bei Bedarf hinzufügen. Verwendet die Schnittstellenbibliothek.

So weit so gut. Es gibt jetzt keine zirkuläre Abhängigkeit. Sobald ein Webservice aufgerufen werden muss, verwendet die Business-Logik-Bibliothek die Bibliothek "transporter", um die externe Methode aufzurufen. Das funktioniert ziemlich gut.

Aber jetzt muss ich einen Webservice erstellen, wo 3rd Business Objekte auf unserer Seite erstellen können. Ich möchte eine "Transformationsbibliothek" erstellen, in der Geschäftsobjekte in Nachrichtenobjekte für die externen Webservices umgewandelt werden und umgekehrt. Und da denke ich ist das Problem mit meiner aktuellen Architektur. Wenn ich diese Bibliothek erstellen möchte, bekomme ich eine zirkuläre Abhängigkeit. Die Gründe dafür sind

  • Transporter Referenzen Trans
  • Bibliothek Referenzen Trans BL
  • BL Referenzen Transporter

Ich hoffe, dass ich auch meine Situation erklären könnte.

Danke für jede Idee, um das zu lösen.

Antwort

8

Dependency injection zur Rettung:

  1. erstellen ITransporter Schnittstelle , welche Modelle der Dienst von "Transporter" zur Verfügung gestellt. Legen Sie es in die Schnittstellenbibliothek. Machen Sie Transporter implementieren ITransporter.
  2. In Ihrer Geschäftsbibliothek Programm gegen die ITransporter Schnittstelle anstatt direkt Transporter. Jetzt benötigt die Bibliothek keine Abhängigkeit mehr von der Transporterbibliothek.
  3. in Ihrer Anwendung/Web-Service wo man alles zusammenkleben, eine Instanz von Transporter erstellen und injizieren, wo Sie ein ITransporter Objekt in Ihrem Unternehmen Code benötigen.
+0

+1 erstellen für den richtigen Vorschlaghammer. Es könnte jedoch immer noch eine weniger kraftvolle Lösung geben, als die Modulierung zu überdenken. –

+0

Hmm klingt gut also sollte ich auch die Transformationen in der Transporter-Bibliothek enthalten? – nWorx

+0

@unicron: nicht unbedingt. –

1

Sie können Ihr Design überdenken. Ist es sinnvoll, ALLE Webservices von Drittanbietern in einer DLL zu gruppieren und dann die möglicherweise erforderliche Funktionalität (die Transformationen) in eine andere Bibliothek zu verschieben? Ich denke, es wäre sinnvoller, für jeden Web-Service (oder jede Gruppe von Services, wenn es sinnvoll ist, sie zu gruppieren) individuelle Assemblys mit den entsprechenden Funktionen zu erstellen.

Sie haben auch einige fehlerhafte Logik in der Annahme, dass "Transporter-Funktionalität nicht in jedem Projekt benötigt wird". Wenn dies der Fall ist, warum hängt die Business-Logik-Baugruppe davon ab?

+0

hmm das ist eine gute Idee nicht einzelne Bibliotheken für jeden 3rd Party Web Service zu erstellen. Ihr zweiter Punkt ist wahr, meine Annahme war falsch. Die Transportfunktionalität wird in jedem Projekt benötigt * aber nicht benutzt *. Es wird nur in speziellen Fällen verwendet. Ich werde meine Frage korrigieren. – nWorx

0

Ich würde den Transformationscode in die Transporter-Bibliothek legen. Die Transformationen sind dienstespezifisch und müssen nicht von den Transporten getrennt werden. Möglicherweise möchten Sie Namespaces verwenden, um verschiedene Dienste und ihre Transformationen zu trennen. Ich würde auch in Betracht ziehen, nicht alle Dienste in eine einzige Bibliothek zu stellen. Sie verlieren die Fähigkeit, sie in einer granularen Weise zu referenzieren, wenn Sie sie in eine einzige Bibliothek legen - es ist alles oder nichts.

+0

Ich versuchte dies, aber ich würde eine Referenz von Transport benötigen -> bl und bl -> Transport, und wieder eine zirkuläre Abhängigkeit Ich weiß nicht, wie Sie gültige Geschäftsobjekte in transform (Namespace oder Bibliothek) – nWorx

Verwandte Themen