gpt4 book ai didi

c# - ASP.NET MVC - 模型的 WCF 类

转载 作者:太空狗 更新时间:2023-10-29 23:08:18 26 4
gpt4 key购买 nike

ASP.NET | MVC 4 | C# |世界自然基金会

我使用 WCF Web 服务作为从表示层 (MVC) 到数据层 (实体) 的中介。为了简化将数据模型数据从 MVC 移动到 Web 服务,我想我会在 WCF 中使用代理类,这样就会有一个集中的类。不幸的是,这导致模型中属性的 MVC 装饰丢失。有没有一种好的方法可以创建一个集中类以用于 MVC View 的模型,并作为 WCF 服务的传输方法?

自动映射作为一个选项出现在我的脑海中,但我认为这需要两个相同的类。一个在 MVC 端,一个在 WCF 端。如果类中的属性发生更改,这仍然需要我在两侧进行更改。

如有任何其他建议,我们将不胜感激。谢谢!

编辑::示例

这是包含记录表的页面模型

public class ReconcileModel
{
#region PROPERTIES

public List<ReconcileItem> ReconcileItems { get; set;}

#endregion

#region CONSTRUCTORS

public ReconcileModel()
{
ReconcileItems = new List<ReconcileItem>();
}

#endregion
}

这是一个类来表示该表中的每条记录。

public class ReconcileItem
{
#region PROPERTIES

public int ID { get; set; }
public string Description { get; set; }
public string LastLocation { get; set; }
public string LastRead { get; set; }
public string IntendenLocation { get; set; }
public string PickId { get; set; }
public string OEM { get; set; }
public string LotNumber { get; set; }
public string SerialNumber { get; set; }
public DateTime ExpirationDate { get; set; }
public string ReconcileReason { get; set; }
public string RemoveReason { get; set; }


#endregion

#region CONSTRUCTORS

public ReconcileItem()
{
}

#endregion
}

上述类的 WCF 协定表示为

[DataContract]
public class ReconcileItem
{
[DataMemeber]
public int ID { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public string LastLocation { get; set; }
[DataMember]
public string LastRead { get; set; }
[DataMember]
public string IntendenLocation { get; set; }
[DataMemeber]
public string PickId { get; set; }
[DataMember]
public string OEM { get; set; }
[DataMember]
public string LotNumber { get; set; }
[DataMember]
public string SerialNumber { get; set; }
[DataMember]
public DateTime ExpirationDate { get; set; }
[DataMember]
public string ReconcileReason { get; set; }
[DataMember]
public string RemoveReason { get; set; }
}

如果我想更新这条记录,类被发送到 WCF 服务,映射到适当的 Entity Framework 类,并保存到数据库。为了简化传输,我想我会把这个类放在 WCF 项目中并在 MVC 项目中引用它。然后我可以在 WCF 和 MVC 之间来回传递类。此外,如果我更新了 WCF 中的类,那么它将反射(reflect)在 MVC 中。这就是集中的意思。

最佳答案

就像 Adrian 一样,我怀疑您是否真的需要在您的数据库和 MVC 服务之间使用 WCF 服务。对于与数据库对话的客户端应用程序(Win Forms、WPF),这种情况更有可能发生。我目前正在开发一个 Win Forms 项目,我们在其中使用 WCF 作为中间层,我们执行以下操作:

  • 我们有一个在客户端和 WCF/BL 之间共享的程序集(称为“契约(Contract)”)。
  • 此“契约(Contract)”程序集包含所有由 WCF 发送和发送给 WCF 的 DTO。
  • 我们通过在服务引用设置中设置“在指定引用程序集中重用类型”,将 WCF 客户端代理配置为使用契约程序集(而不是让 WCF 重新生成所有 DTO)。
  • 我们用 DataAnnotations 属性(和其他元数据)装饰这些 DTO。
  • 我们用 WCF 属性修饰那些 DTO。 WCF 不需要它们来序列化 DTO。它们是可选的。如果可以,请将它们排除在外。它只会使您的代码困惑。
  • 由于客户端使用相同的程序集,我们可以在客户端上使用 DataAnnotations。
  • 我们也在服务器上进行验证。
  • 我们使用 AutoMapper完成大部分从实体到 DTO 的样板映射(但绝不会反过来)。
  • 坦率地说,您甚至不让 WCF 序列化我们的 DTO,而是使用 JSON.NET而 WCF 只是发送和接收(纯文本)JSON,因为 JSON.NET 在序列化和反序列化数据结构方面要灵活得多。例如,我们使用 JSON.NET 来(反)序列化不可变对象(immutable对象)结构。尝试使用 WCF。那将惨遭失败。

除此之外,我们还:

  • 使用 View 模型类来添加客户端功能。
  • 在契约(Contract)程序集中添加自定义 DataAnnotation 验证,以允许验证在客户端和服务器上运行。
  • 添加 IValidator<T>抽象(某种)以允许服务器或客户端特定验证(通过将实现放在您的业务层或客户端应用程序中)。
  • 使用异常将特定于服务器的验证错误传输回客户端。

关于c# - ASP.NET MVC - 模型的 WCF 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18729052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com