2016-07-08 15 views
1

Ich habe eine Lösung, die mehrere Projekte hat. Es gibt ein MAIN-Projekt, das die einzige externe Schnittstelle für meine Lösung sein soll. Darin habe ich Methoden zur Verfügung gestellt, die Code auslösen und Ergebnisse von einem der eingeschlossenen Projekte zurückliefern. Bisher war es für die Test-App kein Problem, die Methoden aufzurufen, ohne einen Verweis auf die anderen internen Projekte einzubauen.Wie stelle ich den Zugriff auf interne Projektklassen über eine DLL zur Verfügung

Allerdings verwende ich benutzerdefinierte Klassen in meinen Anrufen. Diese Klassen leben in einem der internen Projekte und werden verwendet, um Daten an die Methoden zu übergeben oder eine benutzerdefinierte Antwort von einer Methode abzurufen oder einen benutzerdefinierten Fehler zu generieren. Diese Klassen befinden sich in einem der internen Projekte. Mein Problem ist, dass ich nicht herausfinden kann, wie man einen Verweis auf die erforderlichen benutzerdefinierten Klassen in der aufrufenden Anwendung erhält, ohne einen Verweis auf das Projekt, in dem sich die Klasse befindet.

Als Beispiel hier ist eine Methode, die zur Verfügung gestellt wird Verbraucher durch die main_Project:

public class UtilitiesController 
{ 

    public static ShapeVerifyResponse VerifyShape(int shapeId, float[] dimensions) 
    { 
     ShapeVerifyResponse result = null; 
     IValidateShape worker = new clsGraphics(); 

     try 
     {     
      result = worker.VerifyShape(shapeId, dimensions); 
      return result; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      if (result != null) 
      { 
       result = null; 
      } 
      if (worker != null) 
      { 
       worker = null; 
      } 
     } 

    } 

die ShapeVerifyResponse in einem anderen internen Projekt definiert ist, dass die Modelle und Schnittstellen alles, was ich bin mit enthält. Hier ist die Klasse:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace BBV2_DomainClasses.Models 
{ 
    public class ShapeVerifyResponse 
    { 
     public float Width { get; set; } // Width of shape 
     public float Height { get; set; } // Height of shape 
     public Boolean edgework { get; set; } // is edgework allowed 
     public ArrayList errorlist { get; set; } // list of errors 

    } 
} 

Wie würde ich eine Immobilie in das Hauptprojekt Code, der die Klasse des Projekts Modelle für den Verbraucher Anwendung zurückgibt?

+2

"Mein Problem ist, ich kann nicht herausfinden, wie Sie einen Verweis auf die erforderlichen benutzerdefinierten Klassen in der aufrufenden Anwendung erhalten, ohne einen Verweis auf das Projekt, in dem die Klasse befindet." Nein, du kannst nicht. Sie können nicht erwarten, dass ein Client einen Typ kennt, ohne etwas über die Assembly zu wissen, die diesen Typ enthält. –

+0

Also sollte ich nicht in der Lage sein, diesen Zugriff über eine Eigenschaft meiner DLL bereitzustellen? –

+0

Ich weiß nicht, was du damit meinst. Im Grunde muss der Client jedoch einen Verweis auf die Assembly hinzufügen, die 'ShapeVerifyResponse' enthält. –

Antwort

0

Sie sollten alle Klassen verschieben, die Daten für Anfrage und Antwort darstellen, an das MAIN-Modul. Sie sollten auch Schnittstellen im MAIN-Modul erstellen, die die API für Submodule spezifizieren. In Submodulen Referenz MAIN-Modul und Schnittstellen implementieren.

In diesem Design implementieren Submodule nur Funktionalität, die MAIN benötigt, alle Datenstrukturen und Schnittstellen sind in MAIN. Wenn eine Schnittstelle für den Client-Code nicht sichtbar sein sollte, sollten Sie sie internal setzen und das Attribut InternalsVisibleTo auf Assembly-Ebene verwenden, um es mit anderen Submodulen Ihrer Bibliothek zu teilen, jedoch nicht mit Client-Code (mehr dazu Make internal classes visible to others assemblies).