簡體   English   中英

類構造函數(來自C#Web服務)不會在C#MVC中自動實現屬性

[英]Class constructor (from C# web service) won't auto-implement properties in C# MVC

我正在本地計算機上運行VS2010的兩個實例。 一個實例正在運行我的Web服務(用C#編寫)。 另一個實例正在運行我的MVC Web應用程序(也為C#)。 MVC Web應用程序具有對該Web服務的引用。 我可以從MVC應用程序中成功調用Web服務方法。

在我的Web服務中是一個PageNavigation類:

// PageNavigation.cs
using System;
using System.Collections.Generic;
using System.Text;

public class PageNavigation
{
    public string Page_Number { get; set; }
    public string Page_Count { get; set; }

    public PageNavigation()
    {
        Page_Number = "1";
        Page_Count = "2";
    }
}

默認情況下,當我調用類構造函數時,這應該返回一個具有自動實現屬性的對象:

WebService.PageNavigation pageNavigation = new WebService.PageNavigation();

當在Web服務中的其他位置構造PageNavigation對象時,此方法有效。

pageNavigation.Page_Number
"1"
pageNavigation.Page_Count
"2"

但是,在MVC上運行相同的代碼行並不會得到相同的結果。 對象的屬性均為空值。

pageNavigation.Page_Number
null
pageNavigation.Page_Count
null

這是預期的行為嗎? 有沒有一種方法可以使用預期的默認值填充屬性? 如果需要更多信息,請告訴我,我將更新問題。

服務引用僅查看對象的架構,而不能查看業務邏輯。 在您的情況下,您的服務引用只是在MVC應用程序中創建了Shell數據類型。 創建服務引用時,它實際上是在創建另一個類型,該類型具有與服務中定義的類型相同的屬性名稱和類型。

對於您的特定方案(僅提供默認屬性值,而不是更通用的業務邏輯),應該可以將[System.ComponentModel.DefaultValue]屬性應用於屬性,以便類生成器識別出應該填充這些屬性使用默認值。

順便說一句,如果服務引用正在重用現有的類型(例如,如果您在公共庫中擁有該類型,例如,服務和應用程序都引用了該類型),那么您的業務邏輯將保持完整。

另一種選擇是實現工廠模式,即您在Web服務上調用一個函數,該函數實例化(並可選地填充)數據對象,然后將其返回給客戶端。

是的,這是預期的行為。 MVC站點實際上並未使用您的PageNavigation類。 它是一個簡單的副本(添加Web服務引用時生成),包含所有屬性,但不包含所有方法,包括構造函數。

您可以通過重構服務來解決此問題,以便實體位於單獨的程序集中,然后可以在生成代理時作為選擇在客戶端上重用此程序集。

如果堅持要在客戶端和服務之間使用相同的類型,則在“添加服務引用”對話框的“高級”選項卡上,可以選擇在服務器程序集中重用這些類型。

我將把該類移出服務,並移入服務和客戶端引用的類庫項目。

而且我不會因為默認值之類的小原因而這樣做。 通過將服務和客戶端耦合在一起,這違反了SOA。 對於未運行.NET的客戶端,它將顯然不起作用。

您使用什么序列化器反序列化服務器的響應? 其中一些(例如DataContractSerializer )不調用默認構造函數。

如果實際上使用的是DataContractSerializer ,則應使用的解決方案是使用OnDeserialized屬性,如下所示:

using System.Runtime.Serialization;

public class PageNavigation
{
    public string Page_Number { get; set; }
    public string Page_Count { get; set; }

    public PageNavigation()
    {
        Init();
    }

    [OnDeserialize]
    void Init()
    {
        Page_Number = "1";
        Page_Count = "2";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM