140 votes

Est il possible d’avoir deux classes partielles dans les différentes assemblées représentent la même classe ?

J'ai une classe appelée "Article" dans un projet appelé " MyProject.Des données, qui agit comme une couche de données pour mon application web.

J'ai un autre projet appelé " MyProject.Admin', qui est basé sur le web admin système pour l'affichage et l'édition de données, et a été construit à l'aide de ASP.NET Dynamique de Données.

Fondamentalement, je veux étendre la classe Article, à l'aide d'une classe partielle, de sorte que je peux augmenter une de ses propriétés avec un "UIHint" multiplicateur, ce qui me permettra de remplacer la normale zone de texte multiligne avec un FCKEdit de contrôle.

Ma classe partielle et le répéteur devrait ressembler à ceci:

[MetadataType(typeof(ProjectMetaData))]
public partial class Project
{
}

public class ProjectMetaData
{
    [UIHint("FCKeditor")]
    public object ItemDetails { get; set; }
}

Maintenant, tout cela fonctionne très bien si la classe partielle est dans le même projet que l'original de la classe partielle - à-dire le MyProject.Les données de projet.

Mais l'INTERFACE utilisateur de comportement ne devrait pas s'asseoir sur la couche de Données, mais plutôt, dans l'Admin de la couche. Je tiens donc à déplacer cette classe pour MyProject.Admin.

Cependant, si je fais ça, la fonctionnalité est perdu.

Ma question fondamentale est: puis-je avoir 2 classes partielles dans des projets distincts, mais les deux se référant à la même "classe"?

Si non, est-il un moyen pour accomplir ce que je suis en train de faire, sans se mélanger les données de la couche logique avec la logique de l'INTERFACE utilisateur?

200voto

Darin Dimitrov Points 528142

Vous ne pouvez pas avoir deux classes partielles, se référant à la même catégorie dans deux assemblys différents (projets). Une fois que l’assembly est compilé, les meta-données sont cuit dans, et vos classes ne sont plus partielles. Les classes partielles permet de fractionner la définition de la même catégorie dans deux fichiers.

16voto

Pontus Gagge Points 12950

Comme indiqué, les classes partielles est au moment de la compilation phénomène, pas d'exécution. Classes dans les assemblages sont par définition complète.

Dans MVC termes, vous voulez garder afficher le code distinct du code d'un modèle, mais de permettre à certains types d'INTERFACE utilisateur basée sur les propriétés du modèle. Découvrez Martin Fowler excellent aperçu des différentes saveurs de la MVC, MVP et autres joyeusetés: vous trouverez des idées de design d'abondance. Je suppose que vous pourriez également utiliser l'Injection de Dépendance pour raconter l'INTERFACE utilisateur de ce type de contrôles sont viables pour les entités et les attributs.

L'objectif de la séparation des préoccupations est grande; mais les classes partielles étaient destinées à résoudre des questions complètement différentes (principalement avec la génération de code et de conception de la modélisation des langues).

9voto

8DX Points 41

Méthodes d’extension et ViewModels sont la manière standard d’étendre des objets de couche données dans le frontend comme ceci :

Couche de données (bibliothèque de classes, Person.cs) :

Afficher la couche (application web) PersonExtensions.cs :

ViewModel (pour des données spécifiques à la vue étendue) :

Contrôleur PersonController.cs :

Vue, Person.cshtml :

2voto

leon Points 888

Ajoutez le fichier de base en tant que fichier lié dans vos projets. Il est toujours partiel, mais vous permet de le partager entre les deux projets tout en maintenant leur synchronisation et en même temps un code spécifique à la version / à la structure dans les classes partielles.

1voto

Indy Points 73

J'ai eu des problèmes similaires avec cela. J'ai conservé mes classes partielles dans mon projet de données, donc dans votre cas, le fichier «MyProject.Data». Les MetaDataClasses ne doivent pas aller dans votre projet Admin car vous allez créer des références circulaires en d'autres termes.

J'ai ajouté un nouveau projet de classe Lib pour mes MetaDataClasses, par exemple «MyProject.MetaData», puis l'ai référencé à partir de mon projet de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X