2009-08-23 7 views
10

Ich habe folgende Situation:Circular Referenzen in meiner C# -Projekten

  1. Ein Projekt MyCompany.MyProject.Domain das meine Domain-Modell enthält, und Teilklassen (wie Contact).

  2. Ich mag ‚verlängern‘ (durch partielle Klasse, nicht-Extension-Methode) meine Contact Klasse mit einer Eigenschaft Slug, die mir eine einfache URL freundliche Textdarstellung Vor- und Nachnamen geben.

  3. Ich habe eine String-Extension-Methode ToSlug() in meinem Utility Projekt MyCompany.MyProject.Utilities, die genau was ich will in 2).

  4. Das Problem: Mein Utility Projekt bereits mein Domain Projekt verweisen, was bedeutet, dass ich nicht das Domain Projekt, ohne dass zirkuläre Referenz des Utility Projekt ToSlug() Methode, um zu sehen bekommen kann.

Ich bin nicht daran interessiert, ein anderes Projekt auf die Schaffung dieses Problem zu lösen, und ich möchte wirklich teilten die Slug Logik halten.

Wie kann ich das lösen?

+1

Ist 'Slug' ein passender Name hier? Denken Sie daran, die Gründe für die Verwendung dieses Namens zu erweitern? Was heißt das? –

+0

Der 'circular-reference-problem-c'-Teil in der URL dieser Frage (http://stackoverflow.com/questions/1318123/circular-reference-problem-c) wird als Slug bezeichnet. Es ist im Grunde genommen der technische Begriff für den bezeichnenden (normalerweise menschenlesbaren) Teil einer URL, der auf eine Entität/einen Endpunkt in einer Webanwendung verweist. Meist für SEO oder um die URL besser aussehen zu lassen. – Alex

+0

Ok .... gut in diesem Fall sollte nicht 'Utility.ToSlug()' auf etwas wie 'ISluggable' arbeiten? –

Antwort

13

Ihr Utility Projekt Referenzierung Ihre MyCompany.MyProject.Domain wie ein bisschen ein Codegeruch scheint. Ich gehe hier davon aus, dass dies Dienstprogramme sind, die speziell an Domänenobjekten arbeiten - wenn das der Fall ist, warum schließt du MyCompany.MyProject.Utilities nicht in dein Domain Projekt ein (natürlich den Namespace entsprechend modifizierend)?

In jedem Fall besteht der normale Weg, um diese Art von Abhängigkeiten aufzubrechen, darin, was von einem Projekt benötigt wird, in eine Reihe von Schnittstellen zu abstrahieren und diese in einer separaten Assembly zu kapseln. Bevor Sie das tun, stellen Sie sicher, dass das, was Sie tun konzeptionell ist das Richtige. obwohl

In Ihrer speziellen Situation, betrachten eine Schnittstelle einzuführen, nämlich INameHolder.

public interface INameHolder 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

Dann Contact implementiert INameHolder. INameHolder existiert in einer anderen Baugruppe, nennen wir es MyCompany.MyProject.Domain.Interfaces.

Dann wird Ihr Utilities Projekt verweist Interfaces (nichtDomain) und so tut Domain, aber Interfaces nichts referenziert - die kreisförmige Referenz gebrochen ist.

+0

Ich werde wahrscheinlich damit ... experimentieren jetzt. – Alex

2

Kopie ToSlug Methode Domain Projekt und ToSlug Aufruf der Delegate-Dienstprogramm auf diese neue Methode

+0

"ToSlug-Anruf des Delegate-Dienstprogramms für diese neue Methode" - bitte klären? Wie? – Alex

+0

das war auch mein erster Gedanke - aber ich nahm an, dass die Domain nicht geteilt wurde, so dass die Bibliothek der Erweiterung nicht geladen werden konnte. Ich hätte mich irren können. –

2

Wenn Sie die Domain nicht teilen können (wahrscheinlich richtig) und sie muss die Logik von einer gemeinsam genutzten Bibliothek dann verbrauchen, dann müssen Sie wirklich eine andere Versammlung einführen.

Oder Sie könnten die Logik zur Laufzeit in der Domäne durch Reflexion in der Domäne laden, um auf die abhängige Bibliothek zuzugreifen. Es ist nicht schwer nur bricht Kompilierzeit Überprüfung.

2

Wenn Sie sicher sind, den Code in der Utility-DLL zu behalten (Erics Antwort scheint mir schlau), dann könnten Sie eine Schnittstelle in Ihrem Dienstprogramm-Projekt erstellen, diese Schnittstelle als Parameter an Ihre ToSlug-Methode übergeben und dann haben Ihr Domain-Objekt implementiert die Schnittstelle.