我有一个包含WCF项目和数据类项目的解决方案,每个类都拥有一个" DT"类。这些DT类中的每一个都标记为DataContract(),每个属性都标记为DataMember()。
[DataContract()]
public class AttachmentDT : IAttachment
{
private System.Int32 mAttachmentID;
[DataMember()]
public System.Int32 AttachmentID
{
get { return mAttachmentID; }
set { mAttachmentID = value; }
}
private System.DateTime mCreateDate;
[DataMember()]
public System.DateTime CreateDate
{
get { return mCreateDate; }
set { mCreateDate = value; }
}
private System.Byte[] mFileBytes;
[DataMember()]
public System.Byte[] FileBytes
{
get { return mFileBytes; }
set { mFileBytes = value; }
}
private System.String mFileName;
[DataMember()]
public string FileName
{
get { return mFileName; }
set { mFileName = value; }
}
}
我的WCF项目有一个对数据类项目的类引用,因此我可以访问这些类。如果我不在WCF接口中使用它们中的任何一个,则使用WCF的客户端应用程序也无法查看数据类。为什么是这样?我是否真的必须为我希望客户端看到的每个数据类创建一个空方法?例如,在我的WCF界面中,我创建了一个无用的方法...
[OperationContract()]
void AttachmentDT(AttachmentDT a) { }
如果我有20个数据类,我想提供可见性,我必须为每个做这个愚蠢的垃圾?请告诉我,有一种不那么无知的方式来了解这些DT课程。
答案 0 :(得分:1)
我同意拉胡尔的观点。 你的意图对我来说没有多大意义,但如果你还想去那里,我想你可以通过简单地添加:
[ServiceKnownType(AttachmentDT)]
wcf接口顶部的属性。这样你就不需要那些空方法,服务WSDL应该包含那些类型,允许任何引用你的WCF服务的客户端为它们生成代理。
答案 1 :(得分:0)
除了像类可见性(在你的情况下为public)和缺少DataMember属性(这里也不是这种情况)这样的常见问题之外,我经常在客户端和服务器组件之间的引用程序集中遇到重复类型的问题。
假设您在Visual Studio中生成客户端代理,您是否尝试检查引用程序集中的"重用类型"选项?除非我重用System.Runtime.Serialization.dll
,否则我有时会遇到问题以下是MSDN教程:http://msdn.microsoft.com/en-us/library/vstudio/bb628653(v=vs.100).aspx
答案 2 :(得分:0)
这显然是对的吗?我的意思是我们称之为Abstraction-encapsulation
。那些Data类只能通过WCF服务层可见(如果必须)。客户没有(不应该)知道这些数据类是什么以及他们做了什么。
如果您仍希望显式访问这些Data类及其成员,则始终可以向客户端应用程序添加对这些Data Class项目DLL的引用;但可能不推荐(OR)可能没有多大意义。
答案 3 :(得分:0)
我同意Roman将[ServiceKnownType(...)]
添加到我的WCF服务界面,正确地将所有数据合同类公开给客户端。