2010-07-08 7 views
6

Ho un'architettura simile al seguente:Perché devo fare riferimento a questa assemblea, anche se non è in uso

dati (Libreria di classi che gestisce la nostra roba Entity Framework)
Components (livello intermedio libreria di classi che fa riferimento a libreria di dati)
WebOffice (applicazione web che fa riferimento a libreria di componenti, ma NON libreria di dati)

Ora, ho il seguente frammento di codice (questo vive all'interno dei nostri Components.Payment.cs e tblPayment è contenuto nella nostra libreria di dati.):

public static Payment Retrieve(int id) 
    { 
     var t = repository.Retrieve(id); 
     //the above line returns a tblPayment object 
     if (t != null) 
      return new Payment(t); 
     return null; 
    } 


    public static Payment Retrieve(tblPayment tblPayment) 
    { 
     return new Payment(tblPayment); 
    } 

Dopo averlo aggiunto; il progetto WebOffice sta dando il seguente errore:
errorCS0012: Il tipo "Data.Model.tblPayment" è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all'assembly 'Data, Versione = 3.5.0.0, Culture = neutro, PublicKeyToken = 749b8697f3214861'.

Ora, questo non ha proprio senso per me, perché il progetto WebOffice non chiama affatto il metodo Recupera (tblPayment tblPayment). (Utilizzato solo all'interno della libreria Componenti)

Qualsiasi indizio sul motivo per cui richiederebbe il riferimento dati? Devo fare riferimento a tutte le librerie a cui fa riferimento una libreria referenziata? (prova a dire che 5 volte veloce ...)

risposta

6

La regola generale qui è che un riferimento all'assembly contenente qualsiasi tipo nell'interfaccia pubblica di un altro assembly deve essere aggiunto al progetto. Altrimenti il ​​compilatore non sa come risolvere quel tipo.

Per rispondere alla seconda domanda, non è necessario aggiungere riferimenti ad assiemi contenenti tipi che sono solo utilizzati internamente ad altri assiemi.

+0

Ha senso. Sono stato in grado di contrassegnare il metodo Retrieve (tblPayment tblPayment) come interno; e il mio problema è andato via. Grazie ancora! –

2

Il compilatore deve sapere cosa è tblPayment per eseguire la risoluzione di sovraccarico sul metodo Resolve.

1

Non è possibile risolvere l'interfaccia pubblica per la libreria senza informazioni sui parametri per tutte le sue funzioni. Se si fa riferimento a una libreria in cui un metodo pubblico su un tipo pubblico accetta un parametro di tipo X, è necessario sapere qual è X, indipendentemente dal fatto che si stia utilizzando quel metodo o meno.

Problemi correlati