2009-04-18 7 views
-1

Je vais essayer d'expliquer le problème du mieux que je peux car c'est un peu étrange pour moi.Problème avec référence multiple à une bibliothèque de classes

J'ai une bibliothèque de classe C# qui définit un groupe de classes qui seront utilisées comme objets de transfert de données ou DTO.

Il existe une application Windows Forms qui fait référence à cette bibliothèque de classes DTO et également une référence à une autre bibliothèque de classes qui définit les présentateurs pour le modèle Model - View - Presenter.

Cette bibliothèque de classes de présentateur a une référence à une autre bibliothèque de classes qui contient des classes de proxy WCF.

La bibliothèque de classes proxys WCF a une référence à une autre bibliothèque de classes avec toutes les interfaces qui définissent les contrats pour les services WCF.

Enfin, cette bibliothèque avec les contrats WCF fait référence à la première bibliothèque de classes DTO puisqu'elle est reçue en tant que paramètre pour les méthodes.

Maintenant, après avoir expliqué cette infrastructure, le problème est que le projet de formulaire Windows ne compile l'erreur que je reçois est:

« Proheart.EmployeeView » ne met pas en oeuvre un membre d'interface « Proheart.IEmployeeView.JobDescriptions » . 'Proheart.EmployeeView.JobDescriptions' ne peut pas implémenter 'Proheart.IEmployeeView.JobDescriptions' car il ne possède pas le type de retour correspondant à 'System.Collections.Generic.List'.

Fondamentalement, le code ressemble à ceci:

 
//This interface is defined on the Presenters class library. 
public interface IEmployeeView 
{ 
    List<JobDescriptionDto> JobDescriptions { set; } 
} 

//This is the form in the Windows Forms project 
public partial class EmployeeView : Form, IEmployeeView 
{ 
    public List<JobDescriptionDto> JobDescriptions { set { ... do something } } 
} 

S'il vous plaît, je besoin d'aide. Je sais que toutes les séparations de bibliothèques de classes peuvent sembler étranges mais c'est à cause de la stratégie de déploiement.

Merci. PS Je n'ai pas mentionné auparavant que la bibliothèque de classes Presenter ne possède PAS de référence à la DTO et que le proxy de services WCF ne l'est pas non plus. Il semble qu'il soit extrait de la bibliothèque de classes Service Interfaces car si je l'ajoute manuellement au Presenter, j'obtiens une erreur de référence circulaire.

+0

Avez-vous compilé les assemblages tous en même temps, sont-ils dans la même solution? –

+0

Oui, tous les assemblages sont dans la même solution. –

Répondre

-1

Vous avez manqué l'argument générique:

//This is the form in the Windows Forms project 
public partial class EmployeeView : Form, IEmployeeView 
{ 
    public List<JobDescriptionDto> JobDescriptions { set { ... do something } } 
} 
+0

A) Il l'a édité pour l'inclure. B) Il aurait eu une erreur de compilateur différente si c'était le cas. – Samuel

+0

System.Collections.Generic.List => message de compilation étrange. Je n'étais pas au courant de ce type dans la bibliothèque de classes de structure de base. –

+0

@Samuel: Ce n'est pas une raison pour un vote négatif. Il y avait une erreur dans le code, j'ai répondu pareil. Et, il aurait pu avoir exactement ce message s'il y a une classe List quelque part, mais pas celle du framework. –

1

Je suspecte que vous pourriez avoir une autre classe de liste définie quelque part à cause de cette ligne dans le message d'erreur

parce qu'il n'a pas le correspondant Type de retour de 'System.Collections.Generic.List'

Déplacez votre curseur sur la liste <> pour voir si les deux font référence à System. Collections.Generic.List

+0

Les deux infobulles sont identiques: Classe System.Collections.Generic.List T est Proheart.BusinessDto.JobDescriptionDto –

+0

Juste par curiosité si vous changez le type de retour « Liste » taper « Liste » sur les deux lieux, compile-t-il? Je pense que votre définition de classe Proheart.BusinessDto.JobDescriptionDto peut être désynchronisée dans deux assemblys différents – oscarkuo

+0

Si je le change en Liste il compile. Après cela, j'ai supprimé toutes les références, compilé uniquement la classe DTO et l'ai lu dans tous les projets. Toujours avec le même résultat. –

0

Un style de remplacement consiste à autoriser les DTO référencés par les classes proxyy à ne pas être identiques aux DTO renvoyés par le service. Cela peut sembler étrange, mais c'est ainsi que cela se passerait si votre client était écrit en Java, par exemple.Le client ne voit que les versions proxy des interfaces de service et des versions proxy de la classe DTO auxquelles il est fait référence dans les interfaces de service.

Cela réduit le couplage à travers la limite de service.

Questions connexes