2016-04-19 5 views
0

Ich entwickle gerade eine kleine App, um einige neue Konzepte zu lernen. Ich habe einige Klassen entwickelt, die den MBR und verschiedene Partitionen von der Festplatte analysieren.C# Bibliothek, Konstruktor mit Typ eines anderen Projekts

So hatte ich die Idee, es modularer zu machen. Ich dachte daran, all diese Methoden in eine Bibliothek namens DiskParsers zu bringen, die Daten analysiert. Und eine andere Bibliothek, die native Methoden zum Ausführen von Datenträger-E/A aufruft. Jetzt ist das Problem, dass der Konstruktor einen Parameter eines benutzerdefinierten Typs hat, der von mir in der Datenträger-IO-Lib geschrieben wurde, der Lese- und Schreibvorgänge auf dem physischen Laufwerk handhabt. Meine Bibliothek weiß nicht, was dieser Typ ist.

Wie kann ich das lösen? Generika verwenden? Eine Schnittstelle der Festplatten-I/O-Klasse zu meiner Parser-Bibliothek bündeln? Meine Parser-Bibliothek sollte nur Byte-Puffer akzeptieren und keine Beziehung von benutzerdefinierten Typen haben?

+0

Hinzufügen eines Verweises auf die IO-Bibliothek von Ihrer DiskParsers-Bibliothek? Oder verwenden Sie Schnittstellen, um die Bibliotheken zu entkoppeln? –

+0

Fügen Sie eine weitere Bibliothek hinzu, die nur DTOs oder Schnittstellen enthält. Schwer zu beantworten ohne konkreten Code. – CodeCaster

+0

@DStanley also sollte ich dann die dll in das übergeordnete Verzeichnis meiner exe kopieren? – jisuskraist

Antwort

1

Sie können Ihre Parser-Bibliothek so implementieren, dass es nicht darauf ankommt, woher die zu analysierenden Daten stammen. So etwas wie folgt aus:

public class MBRParser 
{ 
    public MasterBootRecord Read(Stream stream) 
    { 
     // parsing logic 
    } 

    public MasterBootRecord Read(IMBRReader reader) 
    { 
     // parsing logic 
    } 

} 

public interface IMBRReader 
{ 
    MasterBootRecord Read(); 
} 

Jetzt kann ein Client-Programm, um Ihre I/O-Bibliothek nehmen den Parser mit einem Stream zu bieten:

public class Program 
{ 
    public static void Main() 
    { 
     var stream = new IOLibrary.Stream(); 
     var mbrParser = new MBRParser(); 
     var mbr = mbrParser.Read(stream); 
    } 
} 

Oder Ihr Client-Programm implementiert eine konkrete IMBRReader:

public class NativeMBRReader : IMBRReader 
{ 
    public MasterBootRecord Read() 
    { 
     // native I/O methods to read MBR 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     var mbrReader = new NativeMBRReader(); 
     var mbr = mbrReader.Read(); 
    } 
} 

So oder so: Ihre Bibliotheken müssen sich nicht kennen. Nur das Client-Programm benötigt einen Verweis auf beide. Die Referenzierung der Bibliotheken kann auf verschiedene Arten erfolgen. Am einfachsten: Legen Sie sowohl Bibliotheksprojekte als auch das Client-Programm in eine Lösung. Fügen Sie im Client-Projekt Projektverweise zu den Bibliotheken hinzu.