我有一个ASP.NET(.asmx)Web服务项目,其方法如下:
public int GetData(Data d);
Data类具有属性:
public class Data
{
public int Id { get; set; }
public string Name { get; set; }
}
我希望客户端看到“Id”属性,而不是“Name”属性。它们都必须公开,因为应用程序的内部逻辑需要公开这些属性。
那么如何设置“名称”属性对客户端不可见而不更改其公共访问者,并且不设置私有get,私有集?
答案 0 :(得分:6)
您可以使用XmlIgnore标记阻止序列化,客户端生成的代理类将不包含属性Name。
public class Data
{
public int Id{get;set;}
[XmlIgnore()]
public string Name{get;set;}
}
答案 1 :(得分:1)
我相信您正在发现使用DTO的一个很好的理由。 DTO(数据传输对象)是您想要向外界展示的。
因此,在您的示例中,您的Data
对象是您在应用程序内部使用的域对象,但它包含您不希望提供给其他任何人的属性。然后,您拥有DataDto
对象,该对象是您与其他人共享的外部公开对象。
然后,在您发送信息之前,您将从Data
映射到DataDto
,如果有必要,如果您在请求中收到DataDto,则会映射另一种方式。 (或者使用像AutoMapper这样的工具)。
public class Data
{
public int Id { get; set; }
public string Name { get; set; }
}
public class DataDto
{
public int Id { get; set; }
}
答案 2 :(得分:0)
公共类数据
{
public int Id {get;组; }
public string Name {get;私人集; }
} 击>
我从未这样做过......但这可行吗? (在@ChrisBD回答之后)
public class Data
{
public int Id { get; set; }
public string Name { get; internal set; }
}
答案 3 :(得分:0)
如果你可以使用WCF,当至少有一个属性/成员被标记[DataMember]
属性时,所有标记都被序列化,所有其他都不是
答案 4 :(得分:0)
使用内部访问修饰符,因为这限制了对同一程序集中的项目的访问权限。
public class Data
{
public int Id{get;set;}
internal string Name{get;set;}
}
答案 5 :(得分:0)
您也可以使用,
[IgnoreDataMember]
public string Name
{
get;
set;
}