2014-05-13 29 views
0

我有一個類在其構造函數中初始化其屬性。如何確保爲通過webservice暴露的類的屬性設置初始值

public class Criteria 
{ 
    public bool Chapter1 { get; set; } 
    public bool Chapter2 { get; set; } 
    ... 
    public uint MaxResults { get; set; } 
    public int Hits { get; set; } 

    public Criteria() 
    { 
     Chapter1 = false; 
     Chapter2 = false; 
     ... 
     MaxResults = 100; 
     Hits = -1; 
    } 
} 

此類在Web服務內部用於配置對數據庫的搜索。當我在內部構造類時,執行正確的初始化並且操作如預期。

然而,類也暴露作爲參數的方法,這個Web服務:

[WebMethod] 
    public List<xxx> GetxxxCollection(string requestingUserName, Criteria sc) 
    { 
     ... 
    } 

此前的客戶端調用這個Web服務,Criteria對象的構造和配置。但是,因爲它通過Web服務公開,構造函數實際上並沒有被調用,並且客戶端並不總是正確設置所有必需的值。

鑑於我們對客戶端代碼的控制有限,確保設置適當的初始值的最佳策略是什麼?

+0

它已經一段時間以來,我使用這些基本的Web服務,但IIRC,是不是在反序列化之前調用的無參數構造函數?無論如何,你的屬性不必在構造函數中設置它們,而是在字段聲明中設置它們的初始值。編輯:但如果這是真的,默認的構造函數_is_運行,那麼也許你需要仔細檢查正在發送的數據:也許你沒有發送正確的信息。 –

+0

ASMX是一項傳統技術,不應用於新開發。 WCF或ASP.NET Web API應該用於Web服務客戶端和服務器的所有新開發。一個暗示:微軟已經在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 –

+0

客戶端將負責正確初始化對象。如果客戶沒有足夠的知識去做,那麼您將需要重新考慮您的方法/重新設計您的應用程序。 – Tim

回答

1

您無法以任何方式控制客戶端。客戶端上的「服務」類與包含構造函數的服務類無關。這只是一個「代理」類,而不是真實的。

0

也許您可以使用nullable字段,以便您知道客戶端未在字段中設置任何值。

+0

-1:你有沒有在ASMX服務中試過可空值類型?如果客戶端將該值設置爲空,該怎麼辦? –

+1

不,我不這樣說,爲什麼我說可能'null'可以等於NOT設置,如果'null'本身不是一個值。目前還不清楚 – sallushan

+0

@John,我在ASMX中測試過,並且工作得很好。 – sallushan

0

不要在課堂上使用自動實現的屬性,而是與威力在默認情況下沒有一個構造函數調用初始化後備字段使用古老的手工性質:

public class Criteria 
{ 
    private int _maxResults = 100; 

    //----------------------------------------------------------------------- 

    public int MaxResults 
    { 
    get{ return _maxResult; } 
    set{ _maxResults = value; } 
    } 

} 
+0

我檢查了這個東西,它沒有初始化爲100,值爲0。 – sallushan