【问题标题】:Sharing assemblies using Portable Class Library with DataAnnotations使用带有 DataAnnotations 的可移植类库共享程序集
【发布时间】:2013-11-18 18:27:39
【问题描述】:

我创建了一个名为DataContracts 的可移植类库,其中包含我的项目MessagesViewsGetStockItemByIDRequestStockView 等标准内容都包含在其中。

问题在于,当我尝试使用System.ComponentModel.DataAnnotations 为我的一些Views 添加DataAnnotations 时。

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

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

我可以成功地将System.ComponentModel.DataAnnotations 添加到我的可移植类库项目中,并且可以在我的 Windows Phone 8 应用程序中成功引用它,甚至可以在我的 Windows Phone 应用程序中创建我的视图的新实例,例如 StockView View = new StockView(); 但是如果我尝试使用Newtonsoft.JsonSystem.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.DataAnnotations is supported in Windows Phone 8 (但是为什么我可以将它添加为我的 PCL 的引用?)。

所以我的问题是,为什么当我直接创建这些类的新实例时没有调用这个错误,其次我该如何解决这个问题?

【问题讨论】:

  • 自定义属性不在创建新类实例的过程中。
  • 还不错,但是避免这个问题的正确方法是什么。肯定其他人已经尝试过创建跨项目兼容的便携式类库吗?

标签: c# asp.net-mvc windows-phone-8 data-annotations portable-class-library


【解决方案1】:

不幸的是,DataAnnotations 目前不可移植。虽然有点复杂,但您可以通过在 PCL 中编写自己的 DataAnnotation 属性并为 .NET Framework 项目创建一个具有相同名称的程序集来解决此问题,该程序集将属性类型转发到“真实”版本。有关更多详细信息,请参阅this answer

【讨论】:

  • 嗨,Daniel,感谢您的回答,但似乎可以通过 Silverlight 程序集引用 DataAnnotations 属性的可移植版本。
【解决方案2】:

好吧,事实证明我最初的假设是完全错误的。您绝对可以从 Windows Phone 8 项目中引用 System.ComponentModel.DataAnnotations 命名空间。

基本上它归结为反直觉地引用可位于C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.DataAnnotations.dll 中的 dll 的 silverlight 版本

有关如何构建可移植类库的更多信息,我建议referring to this article

【讨论】:

    【解决方案3】:

    某些 PCL 配置文件支持数据注释。

    支持的配置文件:

    • .NET 4.0.3 及更高版本
    • Windows 应用商店 8 及更高版本
    • Silverlight 4 及更高版本

    最值得注意的是,不支持最新的 Windows Phone(当时为 8.1)。

    查看完整的 PCL 功能表: http://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx

    【讨论】:

    • 微软到底为什么坚持让这些东西在他们自己的平台上变得如此模糊?
    【解决方案4】:

    1) 创建新类实例的过程不涉及读取自定义属性,通过反射加载。

    2) System.ComponentModel.DataAnnotations 是 ASP.NET 独有的

    System.ComponentModel.DataAnnotations 命名空间提供属性 用于为 ASP.NET MVC 和 ASP.NET 定义元数据的类 数据控制。

    【讨论】:

    • 为第一次洞察干杯,但 System.ComponentModel.DataAnnotations 不仅适用于 ASP.NET。它在 WPF 中也被广泛使用。
    【解决方案5】:

    System.ComponentModel.DataAnnotations 的可移植版本似乎不完整(例如没有 MaxLengthAttribute)。

    有这个库:

    https://github.com/ryanhorath/PortableDataAnnotations

    Install-Package Portable.DataAnnotations
    

    您的 PCL 需要以 Silverlight 8 为目标,否则您将收到多个类定义错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      相关资源
      最近更新 更多