Ich habe eine Klasse namens "Artikel" in einem Projekt namens "MyProject.Data", die als Datenschicht für meine Webanwendung fungiert.
Ich habe ein separates Projekt namens 'MyProject.Admin', ein webbasiertes Administrationssystem zum Anzeigen / Bearbeiten der Daten, das mit ASP.NET Dynamic Data erstellt wurde.
Grundsätzlich möchte ich die Article-Klasse mithilfe einer Teilklasse erweitern, damit ich eine ihrer Eigenschaften mit einem "UIHint" -Extender erweitern kann, mit dem ich das normale mehrzeilige Textfeld durch ein FCKEdit-Steuerelement ersetzen kann.
Meine Teilklasse und mein Extender würden so aussehen:
[MetadataType(typeof(ProjectMetaData))]
public partial class Project
{
}
public class ProjectMetaData
{
[UIHint("FCKeditor")]
public object ItemDetails { get; set; }
}
Dies funktioniert nun einwandfrei, wenn sich die Teilklasse im selben Projekt wie die ursprüngliche Teilklasse befindet, dh im MyProject.Data-Projekt.
Das Verhalten der Benutzeroberfläche sollte jedoch nicht in der Datenebene, sondern in der Admin-Ebene liegen. Daher möchte ich diese Klasse nach MyProject.Admin verschieben.
Wenn ich das mache, geht die Funktionalität jedoch verloren.
Meine grundlegende Frage lautet: Kann ich zwei Teilklassen in separaten Projekten haben, aber beide beziehen sich auf dieselbe "Klasse"?
Wenn nicht, gibt es eine Möglichkeit, das zu erreichen, was ich versuche, ohne Datenschichtlogik mit UI-Logik zu mischen?
quelle
MetadataType
macht Models eher zu ViewModels.Antworten:
Nein, Sie können nicht zwei Teilklassen haben, die sich auf dieselbe Klasse in zwei verschiedenen Assemblys (Projekten) beziehen. Sobald die Assembly kompiliert ist, werden die Metadaten eingebrannt und Ihre Klassen sind nicht mehr partiell. Mit Teilklassen können Sie die Definition derselben Klasse in zwei Dateien aufteilen.
quelle
Wie bereits erwähnt, sind Teilklassen ein Phänomen zur Kompilierungszeit und keine Laufzeit. Klassen in Baugruppen sind per Definition vollständig.
In MVC-Begriffen möchten Sie den Ansichtscode vom Modellcode trennen und dennoch bestimmte Arten von Benutzeroberflächen basierend auf den Modelleigenschaften aktivieren. Schauen Sie sich Martin Fowlers hervorragenden Überblick über die verschiedenen Geschmacksrichtungen von MVC, MVP und so weiter an: Sie werden jede Menge Designideen finden. Ich nehme an, Sie können auch Dependency Injection verwenden , um der Benutzeroberfläche mitzuteilen, welche Steuerelemente für einzelne Entitäten und Attribute geeignet sind.
Ihr Ziel, Bedenken zu trennen, ist groß. Teilklassen sollten jedoch ganz andere Probleme angehen (hauptsächlich mit Codegenerierung und Modellierungssprachen zur Entwurfszeit).
quelle
Erweiterungsmethoden und ViewModels sind die Standardmethode zum Erweitern von Datenebenenobjekten im Frontend wie folgt:
Datenschicht (Klassenbibliothek, Person.cs):
Anzeigeebene (Webanwendung) PersonExtensions.cs:
ViewModel (für erweiterte ansichtsspezifische Daten):
Controller PersonController.cs:
Ansicht, Person.cshtml:
quelle
Fügen Sie die Basisdatei als verknüpfte Datei zu Ihren Projekten hinzu. Es ist immer noch teilweise, aber da Sie es für beide Projekte freigeben können, halten Sie sie synchron und haben gleichzeitig version- / Framework-spezifischen Code in den Teilklassen.
quelle
Ich hatte ähnliche Probleme damit. Ich habe meine Teilklassen in meinem Datenprojekt behalten, also in Ihrem Fall die 'MyProject.Data'. MetaDataClasses sollten nicht in Ihr Admin-Projekt aufgenommen werden, da Sie auf andere Weise Zirkelverweise erstellen.
Ich habe ein neues Class Lib-Projekt für meine MetaDataClasses hinzugefügt, z. B. 'MyProject.MetaData', und dieses dann aus meinem Datenprojekt referenziert
quelle
Verwenden Sie möglicherweise eine statische Erweiterungsklasse.
quelle
Ich kann mich hier irren, aber könnten Sie nicht einfach die ProjectMetaData-Klasse in Ihrem MyProject.Admin-Projekt definieren?
quelle
Fügen Sie einfach eine Klassendatei als Link in Ihr neues Projekt ein und behalten Sie den gleichen Namespace in Ihrer Teilklasse bei.
quelle
Seit 2019 können Sie mit einem Trick 2 Teile einer Teilklasse in verschiedenen Baugruppen haben. Dieser Trick wird in diesem Artikel erklärt und demonstriert:
https://www.notion.so/vapolia/Secret-feature-Xamarin-Forms-control-s-auto-registration-1fd6f1b0d98d4aabb2defa0eb14961fa
Im Kern wird die Erweiterung MSBuild.Sdk.Extras für SDK-ähnliche Projekte verwendet, mit der die Einschränkung behoben wird, dass alle Teilteile einer Klasse in derselben Assembly enthalten sind, indem ein Projekt mit mehreren gleichzeitigen Zielen verwendet wird, wodurch effektiv mehrere Assemblys in einer Kompilierung erstellt werden des gleichen Projekts.
quelle