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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top