Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC-模型的WCF类_C#_Asp.net Mvc_Wcf_Asp.net Mvc 4 - Fatal编程技术网

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

C# ASP.NET MVC-模型的WCF类,c#,asp.net-mvc,wcf,asp.net-mvc-4,C#,Asp.net Mvc,Wcf,Asp.net Mvc 4,ASP.NET | MVC4 | C | WCF 我使用WCF web服务作为从表示层(MVC)到数据层(实体)的中介。为了简化将数据模型数据从MVC移动到web服务的过程,我想我应该在WCF中使用代理类,这样就可以有一个集中的类。不幸的是,这导致模型中属性上的MVC装饰丢失。有没有一种好方法可以创建一个集中式类,用于MVC视图的模型,也可以作为WCF服务的传输方法 自动映射作为一个选项出现在脑海中,但我相信这需要两个相同的类。一个在MVC侧,一个在WCF侧。如果类中的某个属性发生了更改,则仍然

ASP.NET | MVC4 | 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
}
上述类别的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服务,映射到适当的实体框架类,并保存到数据库中。为了简化转换,我想我应该把这个类放在WCF项目中,并在MVC项目中引用它。然后我可以在WCF和MVC之间来回传递这个类。此外,如果我在WCF中更新了类,那么它将反映在MVC中。这就是所谓的集中化

您仍然可以使用实体,但可以创建视图模型,并将数据注释放在这些模型上。关于如何在项目中进行验证,有很多讨论。一般来说,它几乎总是一个给定的,它需要出现在UI上,然后通常也出现在其他地方。我会尽量避免将它集中起来,因为这是行不通的(一刀切很少适合所有人)

关于在您的解决方案中嵌入WCF层的问题,除非有很好的理由,否则我将不惜一切代价避免这样做。我见过这种事情出过很多次错。它带来了很多负面影响。在我处理过的两个商业案例中,您最终会遇到太多的端点和太多的闲聊。它削弱了将业务逻辑放在实体中并在线使用这些方法的能力,使维护成为一场噩梦,如果没有足够的硬件和仔细的设计,如果托管在一台服务器上,您可能最终不得不使用命名管道来获得所需的速度,这否定了使用WCF所获得的任何分布式优势


最好将繁重的处理任务外部化为组件,您可以在其他地方托管这些组件,并通过更小、更简洁的界面进行通信。实际上,除了图像处理、数学和科学应用之外,不会出现繁重的数据处理。

我们使用WCF的方式与您在我当前雇主的帖子中描述的方式相同。我们最终为WCF和MVC提供了DTO类,以便与之通信,然后在MVC应用程序中查看模型,以便在UI中进行模型绑定和验证

我同意,让类彼此几乎重复并在它们之间进行映射是一件痛苦的事情,在某种程度上似乎是错误的。从我过去读到的,我们所做的,以及你可能被迫做的,是最佳实践

Adrian在上文中提出的仅由WCF完成繁重处理的建议也是有道理的。在开始我目前的工作之前,我就是这么做的。大多数业务逻辑被放置在MVC应用程序直接引用的业务层程序集中。对于少数几个可能长时间运行的进程,我创建了独立托管的WCF服务,MVC应用程序与之通信

最后,你能使用WebAPI和WCF吗?Web API是轻量级的,利用HTTP而不需要WCF绑定等带来的所有开销。此外,使用Web API,您可以使用MVC应用程序正在使用的相同类,甚至可以在Web API中使用模型验证。这是我一直在努力的事情,并且变得越来越普遍


希望有帮助

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

  • 我们有一个在客户机和WCF/BL之间共享的程序集(称为“合同”)
  • 此“合同”程序集包含通过线路发送到WCF的所有DTO
  • 我们通过在服务引用设置中设置“指定引用程序集中的重用类型”,将WCF客户端代理配置为使用协定程序集(而不是让WCF重新生成所有DTO)
  • 我们用DataAnnotations属性(和其他元数据)装饰这些DTO
  • 我们不使用WCF属性装饰那些DTO。WCF不需要它们来序列化DTO。它们是可选的。如果可以的话,把它们删掉。它只是把你的代码弄乱了
  • 由于客户端使用相同的程序集,我们可以在客户端上使用DataAnnotation
  • 我们也在服务器上进行验证
  • 我们用它来完成从实体到DTO的大部分样板映射(但从来没有相反的方法)
  • 坦率地说,您甚至不让WCF序列化我们的DTO,而是使用和WCF只发送和接收(纯文本)JSON,因为JSON.NET在序列化和反序列化数据结构时更灵活。例如,我们使用JSON.NET来(反)序列化不可变的对象结构。用WCF试试。这将惨遭失败
除此之外,我们还:

  • 使用视图模型类添加客户端功能
  • 在协定程序集中添加自定义DataAnnotation验证,以允许在客户端和客户端上运行验证
    [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; }
    }