Compartilhando assemblies usando Biblioteca de Classes Portátil com DataAnnotations
-
02-01-2020 - |
Pergunta
Eu criei uma biblioteca de classes portátil chamada DataContracts
que contém meus projetos Messages
e Views
.Coisas padrão como GetStockItemByIDRequest
e StockView
estão contidos nele.
O problema reside quando tento adicionar DataAnnotations
usando System.ComponentModel.DataAnnotations
para alguns dos meus Views
Como tal.
[DataContract]
public class StockView
{
[Required]
[DataMember]
public Guid StockID { get; set; }
[Required]
[DataMember]
public string Name { get; set; }
}
Posso adicionar com sucesso o System.ComponentModel.DataAnnotations
ao meu projeto Portable Class Library e posso referenciá-lo com êxito no meu aplicativo Windows Phone 8 e posso até criar uma nova instância da minha visualização como tal StockView View = new StockView();
dentro do meu aplicativo do Windows Phone, MAS se eu tentar usar qualquer um deles Newtonsoft.Json
ou System.Net.Http.HttpClient
fazendo algo como
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://myservice.com");
T result = await response.Content.ReadAsAsync<T>();
OU
T result = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>("{}");
ou seja:onde a desserialização está envolvida ...
Estou enfrentando o erro Could not load file or assembly 'System.ComponentModel.DataAnnotations, Version=2.0.5.0'
.O que presumo é porque não parece que System.ComponentModel.DataAnnotations
é compatível com Windows Phone 8 (mas então por que posso adicioná-lo como referência ao meu PCL?).
Então, minhas perguntas são: por que esse erro não é invocado quando eu crio uma nova instância dessas classes diretamente e, em segundo lugar, como resolvo isso?
Solução 2
OK, então descobri que minhas suposições originais estavam completamente erradas.Você absolutamente pode fazer referência ao System.ComponentModel.DataAnnotations
namespace de um projeto do Windows Phone 8.
Basicamente, tudo se resume a fazer referência contra-intuitiva à versão silverlight da dll, que pode estar localizada em C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.DataAnnotations.dll
Para mais informações sobre como construir bibliotecas de classes portáteis, sugiro referindo-se a este artigo .
Outras dicas
Infelizmente, o DataAnnotations não é atualmente portátil.Embora seja um pouco complicado, você provavelmente pode contornar isso escrevendo seus próprios atributos DataAnnotation em um PCL e criando um assembly com o mesmo nome para projetos .NET Framework que encaminham os atributos para as versões "reais".Ver esta resposta para mais alguns detalhes sobre isso.
As anotações de dados são suportadas em determinados perfis PCL.
Perfis suportados:
- .NET 4.0.3 e superior
- Windows Store 8 e superior
- Silverlight 4 e superior
Mais notavelmente, o Windows Phone mais recente não é compatível (8.1 na época).
Veja a tabela completa de recursos PCL em:http://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx
1) O processo de criação de uma nova instância de classe não envolve leitura de atributos customizados, que são carregados por reflexão.
2) O System.ComponentModel.DataAnnotations é exclusivo para ASP.NET
O espaço de nome System.ComponentModel.DataAnnotações fornece classes de atributo que são usadas para definir metadados para controles de dados ASP.NET MVC e ASP.NET.
A versão portátil de System.ComponentModel.DataAnnotations parece incompleta (por exemplo, sem MaxLengthAttribute).
Existe esta biblioteca:
https://github.com/ryanhorath/PortableDataAnnotations:
Install-Package Portable.DataAnnotations
Seu PCL precisa ser direcionado ao Silverlight 8, caso contrário, você receberá vários erros de definição de classe.