ASP.NET MVC - 模型的WCF类

Wil*_*ill 5 c# asp.net-mvc wcf asp.net-mvc-4

ASP.NET | MVC 4 | C#| WCF

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

作为一种选择,我想到了自动化,但我认为这需要两个相同的类.一个在MVC端,一个在WCF端.如果某个类中的属性发生变化,那么仍需要我对双方进行更改.

任何其他建议将不胜感激.谢谢!

编辑::示例

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

public class ReconcileModel
{
    #region PROPERTIES

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

    #endregion

    #region CONSTRUCTORS

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

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

上面类的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; }
}
Run Code Online (Sandbox Code Playgroud)

如果我想更新此记录,则将该类发送到WCF服务,映射到适当的实体框架类,并保存到数据库.为了简化传输,我想我会把这个类放在WCF项目中并在MVC项目中引用它.然后我可以在WCF和MVC之间传回这个类.此外,如果我在WCF中更新了类,那么它将反映在MVC中.这就是集中化的意思.

Ste*_*ven 2

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

  • 我们有一个在客户和 WCF / BL 之间共享的程序集(称为“合同”)。
  • 此“合同”程序集包含由 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 来序列化(反)序列化不可变对象结构。使用 WCF 尝试一下。那将会惨败。

最重要的是我们做:

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