Sollten sich Schnittstellen in einem separaten Projekt von ihrer Implementierung befinden?

8

Bei meiner Frage geht es nicht so sehr um den Einsatz von Schnittstellen, sondern eher um die Art der Projektorganisation.

Hinweis: Ich verwende VisualStudio in einer mehrschichtigen Anwendung.

Sollten meine Interface-Dateien in einem separaten Projekt von ihren Implementierungen leben? Mein erster Gedanke ist, dass es nützlich wäre, alle meine Service-Interfaces in ihr eigenes Projekt (und ein Projekt für meine Initiale) aufzuteilen Implementierungen), so dass die Umsetzung / konkretes Projekt gegebenenfalls entfernt und durch eine neue ersetzt werden kann.

Um es mit einem Beispiel zu verdeutlichen: Angenommen, ich habe eine Business-Layer-Schnittstelle namens IBusinessService, die im Namespace MyApp.Business.Services angesiedelt ist. Meine Implementierung FooBusinessService würde im selben Namespace existieren, aber ein anderes Projekt in VisualStudio. Wenn später die Implementierung überarbeitet werden muss, kann ein Entwickler den Verweis auf FooService.proj entfernen und durch einen Verweis auf BarService.proj ersetzen.

Dies würde die App-Lösung entwirren, indem Sie ein Projekt mit nur Schnittstellen referenzieren könnten, ohne auch konkrete Implementierungen zu erhalten (die veraltet oder für Sie nutzlos sind), aber fehlt mir etwas?

    
Ben Elder 28.10.2009, 12:32
quelle

1 Antwort

10

Ich bin bei dir. Ich ziehe es vor, meine Schnittstellen in ein separates Projekt UND in einen anderen Namensraum zu stellen. Das klassische Beispiel ist mit Datenzugriffsklassen. Sie möchten in der Lage sein, eine MSSQL-Version und eine MySQL-Version zu codieren, die beide die gleiche Schnittstelle implementieren. Daher bevorzuge ich die Schnittstellendefinition in einer separaten Assembly / einem separaten Projekt. Hier ist ein Beispiel, wie ich Assemblys und Namespaces auslege:

  • Elder.DataAccess.Core - enthält die Schnittstellen und allgemeinen Dienstprogramme
  • Elder.DataAccess.MSSQL - spezifische MSSQL-Implementierungen der Schnittstellen
  • Elder.DataAccess.MySQL - spezifische MySQL-Implementierungen der Schnittstellen

Dadurch kann ich die Implementierungen ändern, ohne das Projekt zu berühren, das die Schnittstellendefinitionen enthält. Dies hilft mir auch bei der Versionskontrolle und Änderungsverfolgung. Es könnte andere Wege geben, diese Katze zu häuten, also werde ich gespannt darauf sein, die Antworten anderer Leute zu sehen.

    
Scott Fletcher 28.10.2009, 14:21
quelle