Erstellen einer gemeinsam genutzten Bibliothek, die möglicherweise für Desktopanwendungen und Webprojekte verwendet wird

8

Ich war im letzten Jahr an einer Reihe von MVC.NET- und c # -Desktopprojekten in unserem Unternehmen beteiligt und habe es auch geschafft, meine Nase in andere Projekte zu stecken (natürlich in einer schreibgeschützten Lernkapazität).

Dabei ist mir aufgefallen, dass es in den verschiedenen Projekten und Teams viele Funktionen gibt, die gut gegen gute Schnittstellen und Abstraktionen ausgelegt sind. Da wir manchmal unsere eigene Arbeit mögen, bemerkte ich, dass einige Projekte genau dieselbe Klasse hatten, Methode, die offensichtlich in eine kopiert wurde, und daher leicht in ein neues Projekt verschoben werden konnten (wahrscheinlich von demselben Entwickler, der ursprünglich schrieb es)

Ich erwähnte diese Tatsache in einem unserer gelegentlichen Programmierertreffen und schlug vor, einige dieser Funktionen in eine Kernbibliothek des Unternehmens zu integrieren, die wir im Laufe der Zeit aufbauen und für mehrere Projekte verwenden können. Alle waren sich einig und ich begann diese Möglichkeit zu prüfen.

Ich bin jedoch ziemlich früh auf einen Stolperstein gestoßen. Unser Team konzentriert sich derzeit hauptsächlich auf MVC und wir haben Projekte hauptsächlich in 2.0, beginnen aber, auf 3.0 zu verzweigen. Wir haben auch eine Reihe von Desktop-Anwendungen, die von einigen gemeinsam genutzten Klassen und grundlegenden Hilfsmethoden profitieren können.

Anfangs habe ich beim Erstellen dieser DLL einige gemeinsam genutzte Klassen aufgenommen, die für jeden Projekttyp (Web, Client usw.) verwendet werden können. Dann habe ich versucht, einige gemeinsam genutzte Module hinzuzufügen, die nur in unseren MVC-Anwendungen nützlich sind. Dies bedeutete jedoch, dass ich einen Verweis auf einige Microsoft Web-DLLs einfügen musste, um einige der von mir erstellten Klassen nutzen zu können (zu diesem Zeitpunkt MVC 2.0).

Mein Problem ist nun, dass wir eine gemeinsam genutzte DLL haben, die Verweise auf webspezifische Bibliotheken enthält, die möglicherweise auch in einer Clientanwendung verwendet werden könnten. Darüber hinaus hat unsere DLL ursprünglich auf MVC 2.0 verwiesen, und wir werden schließlich für alle Projekte auf MVC 3.0 umsteigen. Aber ich erwarte, dass viele der Klassen in dieser Bibliothek für MVC 3 usw. Noch relevant sind

Unser Code in dieser DLL ist in eigene Namespaces unterteilt, z.

  • CompanyDLL.Primitives
  • CompanyDLL.Web.Mvc
  • CompanyDLL.Helpers etc etc.

Meine Fragen sind also:

  1. Ist es in Ordnung, eine gemeinsam genutzte Bibliothek wie diese zu erstellen, oder sollten wir, wenn wir webspezifische Funktionen enthalten, eine separate Web-DLL erstellen, die nur auf ein bestimmtes Framework oder eine bestimmte MVC-Version ausgerichtet ist?
  2. Wenn dies in Ordnung ist, welche Probleme können auftreten, wenn Sie beispielsweise die Bibliothek verwenden, die auf MVC 2 in einem MVC 3-Projekt verweist. Ich würde denken, dass wir möglicherweise auf ein Kompatibilitätsproblem stoßen oder sogar auf Probleme, bei denen die Entwickler, die die Bibliothek verwenden, nicht erkennen, dass sie MVC 2.0-Bibliotheken benötigen. Sie möchten möglicherweise nur einige der generischen Klassen usw. Verwenden

Das Konzept schien damals eine gute Idee zu sein, aber ich fange an zu denken, dass es vielleicht keine wirklich praktische Lösung ist. Aber die Häufigkeit, mit der ich projektübergreifend kopierte Klassen und Methoden gesehen habe, weil sie sich als bewährter Testcode erwiesen haben , ist ein bisschen nervig, um ganz ehrlich zu sein!

AKTUALISIERT : Weiter zu Bernards Antwort, die ich an Bord genommen habe und die mir als guter Rat erscheint. Ich möchte jedoch einige gemeinsam genutzte Klassen erstellen, die wahrscheinlich sowohl in MVC 2- als auch in MVC 3-Projekten nützlich sind. Meine gemeinsam genutzte Assembly muss jedoch auf eines der MVC-Frameworks verweisen, damit ich meine gemeinsam genutzten Klassen überhaupt erstellen kann.

Also weiter auf mein Q2 oben erweitern.

  1. Wenn ich eine MVC 3-Weblösung wollte, müsste ich ein gemeinsames CompanyDLL.Web.Mvc3-Projekt haben, das dann speziell auf MVC 3 verweist? Würde das bedeuten, den gesamten Code von meiner CompanyDLL.Web.Mvc2-Lösung in dieses neue gemeinsam genutzte Mvc3-Projekt zu kopieren?

Es scheint, dass mir einige grundlegende Entwurfsfähigkeiten beim Erstellen gemeinsamer Assemblys sowie beim Erstellen und Verweisen auf verschiedene Framework-Versionen fehlen . Oder es ist genauso einfach, wie wir es aufsaugen und eine CompanyDLL.Web.Mvc2- , CompanyDLL.Web.Mvc3- , CompanyDLL.Web.Mvc4 usw. usw.-Bibliothek erstellen ...

dreza
quelle

Antworten:

5

Erstellen Sie separate gemeinsam genutzte Bibliotheken für Ihre verschiedenen Plattformen (Desktop und Web). Was auch immer diese beiden Bibliotheken benötigen, sollte in einer separaten gemeinsam genutzten Bibliothek gespeichert werden. Sie können diese Bibliotheken also wie folgt aufteilen:

  • Company.Core: Wird von allen Bibliotheken verwendet. Enthält generischen Code, Hilfsklassen usw., die für keine Plattform spezifisch sind. Verweist auf keine anderen gemeinsam genutzten Bibliotheken.
  • Company.Core.Desktop: Wird von Desktop-Anwendungen verwendet. Referenzbibliothek Company.Core.
  • Company.Core.Web: Wird von Webanwendungen verwendet. Referenzbibliothek Company.Core.

Auf diese Weise können Sie die verwendete Webtechnologie ändern, ohne die verwendete Desktop-Technologie zu beeinträchtigen. Auf diese Weise können Sie auch in Zukunft weitere Plattformen hinzufügen (z Company.Core.Mobile. B. ).

Stellen Sie sicher, dass diese Bibliotheken Unit-getestet sind, und kopieren Sie niemals wieder Code zwischen Projekten.

Bernard
quelle
Danke Bernard für den Rat. Was ist mit Problemen beim Verweisen auf verschiedene Versionen von Microsoft-Bibliotheken in den freigegebenen DLLs?
Dreza
Meinen Sie verschiedene Versionen derselben Bibliotheken? MVC 2 gegen MVC 3?
Bernard
Ja, genau das haben wir unter den gleichen Umständen getan. Perfekt.
Gahooa
@ Bernard. Ja. Ich würde erwarten, dass unsere gemeinsam genutzte Bibliothek auf MVC 2 verweist. Aber was ist, wenn ein neues Projekt, das diese Bibliothek verwendet, MVC 3 verwenden möchte? Ich bin mir nicht einmal sicher, ob dies ein Problem ist, aber etwas, dessen Auswirkungen ich nicht kenne
dreza
2
+1; Ich bin mir ziemlich sicher, dass MVC-Versionen, sofern Sie nicht SEHR spezifische Funktionen verwenden, größtenteils so konzipiert sind, dass sie vorwärtskompatibel sind.
RichardW1001