Teilen von Assemblys mithilfe der Portable Class Library mit DataAnnotations
-
02-01-2020 - |
Frage
Ich habe eine portable Klassenbibliothek namens erstellt DataContracts
das meine Projekte enthält Messages
Und Views
.Standardsachen wie GetStockItemByIDRequest
Und StockView
sind darin enthalten.
Das Problem liegt, wenn ich versuche, etwas hinzuzufügen DataAnnotations
durch die Nutzung System.ComponentModel.DataAnnotations
für einige meiner Views
als solche.
[DataContract]
public class StockView
{
[Required]
[DataMember]
public Guid StockID { get; set; }
[Required]
[DataMember]
public string Name { get; set; }
}
Ich kann das erfolgreich hinzufügen System.ComponentModel.DataAnnotations
zu meinem Portable Class Library-Projekt hinzufügen und in meiner Windows Phone 8-App erfolgreich darauf verweisen und sogar eine neue Instanz meiner Ansicht als solche erstellen können StockView View = new StockView();
in meiner Windows Phone-App, ABER wenn ich versuche, eines davon zu verwenden Newtonsoft.Json
oder System.Net.Http.HttpClient
indem man so etwas tut wie
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://myservice.com");
T result = await response.Content.ReadAsAsync<T>();
ODER
T result = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>("{}");
dh:wo es um Deserialisierung geht ...
Ich stehe vor dem Fehler Could not load file or assembly 'System.ComponentModel.DataAnnotations, Version=2.0.5.0'
.Ich gehe davon aus, dass es daran liegt, dass es nicht so aussieht System.ComponentModel.DataAnnotations
wird in Windows Phone 8 unterstützt (Aber warum kann ich es dann als Referenz zu meiner PCL hinzufügen?).
Meine Fragen lauten also: Warum wird dieser Fehler nicht angezeigt, wenn ich direkt eine neue Instanz dieser Klassen erstelle, und zweitens, wie kann ich das umgehen?
Lösung 2
OK, es stellt sich heraus, dass meine ursprünglichen Annahmen völlig falsch waren.Sie können sich auf jeden Fall darauf beziehen System.ComponentModel.DataAnnotations
Namespace aus einem Windows Phone 8-Projekt.
Im Grunde kommt es darauf an, kontraintuitiv auf die Silverlight-Version der DLL zu verweisen, in der sich befinden kann C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.DataAnnotations.dll
Für weitere Informationen zum Erstellen portabler Klassenbibliotheken schlage ich vor unter Bezugnahme auf diesen Artikel .
Andere Tipps
Leider ist DataAnnotations derzeit nicht portierbar.Obwohl es etwas kompliziert ist, können Sie das wahrscheinlich umgehen, indem Sie Ihre eigenen DataAnnotation-Attribute in eine PCL schreiben und eine Assembly mit demselben Namen für .NET Framework-Projekte erstellen, die die Attribute per Typweiterleitung an die „echten“ Versionen weiterleitet.Sehen diese Antwort für weitere Einzelheiten hierzu.
Datenanmerkungen werden in bestimmten PCL-Profilen unterstützt.
Unterstützte Profile:
- .NET 4.0.3 und höher
- Windows Store 8 und höher
- Silverlight 4 und höher
Insbesondere wird das neueste Windows Phone (damals 8.1) nicht unterstützt.
Die vollständige PCL-Funktionstabelle finden Sie unter:http://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx
1) Beim Erstellen einer neuen Klasseninstanz werden keine benutzerdefinierten Attribute gelesen, die durch Reflektion geladen werden.
2) Die System.ComponentModel.DataAnnotations ist exklusiv für ASP.NET
Der Namespace von System.comPonentModel.Dataannotations enthält Attributklassen, mit denen Metadaten für ASP.NET -MVC- und ASP.NET -Datensteuerelemente definiert werden.
Die portable Version von System.ComponentModel.DataAnnotations scheint unvollständig zu sein (z. B. kein MaxLengthAttribute).
Es gibt diese Bibliothek:
https://github.com/ryanhorath/PortableDataAnnotations:
Install-Package Portable.DataAnnotations
Ihre PCL muss auf Silverlight 8 ausgerichtet sein, andernfalls erhalten Sie mehrere Klassendefinitionsfehler.