2014-05-13 27 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