9

Я создал портативную библиотеку классов под названием DataContracts, которая содержит мои проекты Messages и Views. В нем содержатся стандартные вещи, такие как GetStockItemByIDRequest и StockView.Совместное использование сборок с использованием Portable Class Library с DataAnnotations

Проблема заключается в том, что я пытаюсь добавить DataAnnotations, используя System.ComponentModel.DataAnnotations для некоторых из моих Views как таковых.

[DataContract] 
public class StockView 
{ 
    [Required] 
    [DataMember] 
    public Guid StockID { get; set; } 

    [Required] 
    [DataMember] 
    public string Name { get; set; } 
} 

Я могу успешно добавить System.ComponentModel.DataAnnotations в мой портативный проект библиотеки классов и может успешно ссылаться на него в моем Windows Phone 8 приложения и даже может создать новый экземпляр с моей точки зрения как таковой StockView View = new StockView(); в моей Windows Phone App, но если Я стараюсь использовать либо Newtonsoft.Json или System.Net.Http.HttpClient, делая что-то вроде

HttpClient client = new HttpClient(); 
HttpResponseMessage response = await client.GetAsync("http://myservice.com"); 
T result = await response.Content.ReadAsAsync<T>(); 

иЛИ

T result = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>("{}"); 

, т. Е. Где применяется десериализация ...

Я столкнулся с погрешностью Could not load file or assembly 'System.ComponentModel.DataAnnotations, Version=2.0.5.0'. Я полагаю, это потому, что не видно, что System.ComponentModel.DataAnnotationsis supported in Windows Phone 8 (но почему я могу добавить его в качестве ссылки на мой PCL?).

Так что мои вопросы: почему эта ошибка не вызвана, когда я создаю новый экземпляр этих классов напрямую, а во-вторых, как мне обойти это?

+1

Пользовательские атрибуты не создают новый экземпляр класса. – Fals

+0

Хорошо, справедливо, но тогда какой правильный подход избежать этой проблемы. Разумеется, другие пытались создать совместимые с перекрестными портативными портативными библиотеками классов? –

ответ

5

ОК, поэтому выясняется, что мои первоначальные предположения были совершенно неправильными. Вы абсолютно можете ссылаться на пространство имен System.ComponentModel.DataAnnotations из проекта Windows Phone 8.

В основном это сводится к counterintuatively ссылки на SilverLight версии библиотеки DLL, которые могут быть расположены в C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.DataAnnotations.dll

Для получения дополнительной информации о том, как строить портативные библиотеки классов, которые я предлагаю referring to this article.

0

1) Процесс создания нового экземпляра класса не включает считывание пользовательских атрибутов, которые загружаются отражением.

2) System.ComponentModel.DataAnnotations исключительно для ASP.NET

System.ComponentModel.DataAnnotations пространство имен предоставляет атрибуту классы, которые используются для определения метаданных для ASP.NET MVC и ASP.NET управления данными.

+5

Приветствия для первого понимания, но System.ComponentModel.DataAnnotations относится не только к ASP.NET. Он также широко используется в WPF. –

5

К сожалению, DataAnnotations в настоящее время не переносится. Хотя это немного сложно, вы, вероятно, можете обойти это, написав свои собственные атрибуты DataAnnotation в PCL и создав сборку с тем же именем для проектов .NET Framework, которые набирают атрибуты в «настоящие» версии. См. this answer для получения более подробной информации об этом.

+0

Привет, Даниэль, спасибо за ответ, но похоже, что есть портативная версия атрибутов DataAnnotations, на которые можно ссылаться через сборки Silverlight. –

1

Аннотации данных поддерживаются в определенных профилях PCL.

Поддерживаемые профили:

  • .NET 4.0.3 и выше
  • Windows Store 8 и до
  • Silverlight 4 и выше

В частности, последняя Windows Phone не является (8.1 в то время).

Посмотреть полную таблицу PCL функций в: http://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx

+1

Почему Microsoft настаивает на том, чтобы сделать эти вещи настолько затененными на своих собственных платформах? – Jammer

0

Портативная версия System.ComponentModel.DataAnnotations кажется неполным (например, не MaxLengthAttribute).

Существует эта библиотека:

https://github.com/ryanhorath/PortableDataAnnotations:

Install-Package Portable.DataAnnotations 

Ваш PCL должен предназначаться Silverlight 8, в противном случае вы получите несколько ошибок определения класса.

Смежные вопросы