2009-05-08 9 views
2

In C# entwickle ich mehrere Windows-Dienste, die über einige Standardfunktionen verfügen. Daher habe ich all diese allgemeinen Funktionen in ein separates referenziertes Dienstprogrammprojekt eingefügt.C#, Zugreifen auf Klassen aus einem referenzierten Projekt

Ich habe eine Situation, in der ich Instanzen von Business-Klassen erstellen muss, die in meinem Windows-Dienst-Projekt aus dem Dienstprogramm-Projekt mit Activator.CreateInstance befinden.

Mein Dienstprogramm-Projekt kennt den Namespace und den Klassennamen für den Type.GetType-Aufruf, aber der Typ ist immer Null und wenn ich darüber nachdenke, wird es den Typ aus dem Projekt, auf das verwiesen wird, nicht abrufen können zu, oder kann es?

Kurz gesagt:

Projekt A verweist auf Dienstprogramm-Projekt.
Das Dienstprogramm Projekt möchte eine Klasse aus Projekt A erstellen, die den Namespace und den Klassennamen kennt.

Gibt es ein Entwurfsmuster oder einen Ansatz, dem ich folgen sollte, um diese Funktionalität zu erreichen? Oder sieht das wie ein Nein, Nein aus und ich sollte refaktorisieren?

Vielen Dank für

+0

Dank für die Antworten, Ich habe das vielleicht nicht gut erklärt, aber das Projekt, das die Utility-Bibliothek verwendet, ruft in dieser Situation keine Aufrufe an das Dienstprogramm auf. Die Dienstprogrammbibliothek reagiert auf ein Ereignis, das von einer separaten Anwendung ausgelöst wird. Die Parameter für dieses Ereignis sind eine XML-Nachricht, von der ich die Klassendetails ableite. Sobald ich die Klasse erstellt habe, wollte ich die XML-Datei als Parameter an ihren Konstruktor übergeben und ruft im Konstruktor eine Prozessmethode auf, die dann die XML-Datei analysiert. Würde mir eine generische Methode im Utility helfen? Danke noch einmal. – SimonNet

Antwort

1

suchen Sie müssen den vollständig qualifizierten Montagenamen (einschließlich Version usw., wenn es stark benannt ist), wenn Sie Type.GetType wollen eine Art zu finden, die entweder mscorlib oder der anrufenden Anordnung nicht in ist .

Zum Beispiel:

// Prints nothing 
Console.WriteLine(Type.GetType("System.Linq.Enumerable")); 
// Prints the type name (i.e. it finds it) 
Console.WriteLine(Type.GetType("System.Linq.Enumerable, System.Core, " 
    + "Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")); 

Alternativ können Sie das eine generische Methode im Utility-Projekt machen, und erhalten die Anrufer den Typen als Typargument angeben?

0

Klingt wie ein zirkuläres Referenzproblem! Sie müssen möglicherweise umgestalten!

1

Sie könnten in Dependency Injection/Ioc Container suchen.

Zum Beispiel eine Schnittstelle in der Dienstprogrammbibliothek erstellen und diese in einer bestimmten Klasse im Windows-Dienst implementieren. Übergeben Sie dann eine Instanz an die Dienstprogrammklasse. Auf diese Weise hat die Dienstprogrammbibliothek nichts über den Windows-Dienst erfahren.

4

Sie können das Zirkelbezugsproblem mithilfe von Reflektion lösen, wie Jon betont hat, aber ich schlage vor, das Design zu überdenken und zu refaktorisieren. Zwei Vorschläge.

  • Verwenden Schnittstellen A und B. (bevorzugte Lösung)
  • Bewegen des Teils benötigt durch A und B in C und C nur als Referenz von A und B decuple
Verwandte Themen