2010-07-08 13 views
6

Tengo una arquitectura similar a la siguiente:¿Por qué necesito para hacer referencia a esta asamblea, a pesar de que su uso no se ha

de datos (biblioteca de clases que se encarga de nuestras cosas Entity Framework)
Componentes (de etapa intermedia biblioteca de clases que hace referencia a la biblioteca de datos)
WebOffice (aplicación web que hace referencia a la biblioteca de componentes, pero NO Data Library)

Ahora, tengo el siguiente fragmento de código (esto vive dentro de nuestros Components.Payment.cs, y tblPayment está en nuestra biblioteca de datos.):

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); 
    } 

Después de que agregué esto; el proyecto de WebOffice está dando el siguiente error:
errorCS0012: El tipo 'Data.Model.tblPayment' se define en un conjunto al que no se hace referencia. Debe agregar una referencia al ensamblado 'Datos, Versión = 3.5.0.0, Cultura = neutral, PublicKeyToken = 749b8697f3214861'.

Ahora, esto no tiene mucho sentido para mí, porque el proyecto WebOffice no llama al método Retrieve (tblPayment tblPayment) en absoluto. (Eso solo se está utilizando dentro de la biblioteca de componentes)

¿Alguna pista de por qué estaría pidiendo la referencia de datos? ¿Debo hacer referencia a cada biblioteca a la que hace referencia una biblioteca referenciada? (intente decir eso 5 veces rápido ...)

Respuesta

6

La regla general aquí es que debe agregarse al proyecto una referencia al conjunto contenedor de cualquier tipo en la interfaz pública de otro ensamblaje. De lo contrario, el compilador no sabe cómo resolver ese tipo.

Para responder a su segunda pregunta, no es necesario que agregue referencias a ensamblajes que contienen tipos que son solo usados ​​internamente en otros ensamblajes.

+0

Tiene todo el sentido. Pude marcar el método Retrieve (tblPayment tblPayment) como interno; y mi problema desapareció ¡Gracias de nuevo! –

2

El compilador necesita saber qué es tblPayment para realizar una resolución de sobrecarga en el método Resolve.

1

No puede resolver la interfaz pública de la biblioteca sin información sobre los parámetros de todas sus funciones. Si hace referencia a una biblioteca en la que un método público en un tipo público acepta un parámetro de tipo X, necesita saber qué es X, independientemente de si está usando ese método o no.

Cuestiones relacionadas