WCF传递没有常见类型dll的复杂类型

时间:2010-12-10 12:04:17

标签: c# wcf

我正试图通过WCF解决问题,在我的示例应用程序中,要求是在我的网站和新的WCF服务之间传递一个类。

我没有常见的类型dll,那么如何通过服务传递我的对象?

我的代码看起来像这样;

网站

namespace HRO_Proof

{

[DataContract(Name = "ThrowAway", Namespace = "http://schemas.proof.com/throwaway/")]
[KnownType(typeof(ThrowAway))]
public class ThrowAway
{
    public Int32 MyValue { get; set; }

    public Boolean SomeFunc()
    {
        return true;
    }
}

}

WCF服务

namespace HRO_ServiceLibarary

{

public class StateService : IStateService
{
    public Int32 SaveThrowaway(object throwAway)
    {
        //Save to DB
        return 0; //Id of inserted record
    }

}

}

我已经阅读了一些关于DataContractResolver的内容,但我不确定如何实现它。

欢迎任何方向帮助。

谢谢, 麦克

2 个答案:

答案 0 :(得分:0)

在类中使用DataMember标记每个成员。函数不能标记为DataMember。

[DataContract]
public class ThrowAway
{
    [DataMember]
    public Int32 MyValue { get; set; }
}

在服务中

public class StateService : IStateService
{
    public Int32 SaveThrowaway(ThrowAway throwAway)
    {
        //Save to DB
        return 0; //Id of inserted record
    }

}

现在,如果您想在您的网站添加服务参考中使用此服务,您应该在代理类中获得Class ThrowAway

答案 1 :(得分:0)

1)[KnownType(typeof(ThrowAway))]:与类本身具有相同类型的KnownType属性是无用的并且是隐式强制执行的。你不需要它。

2)由于各种原因,几乎不能使用对象的参数类型。实际上你需要object类的[KnownType(typeof(ThrowAway))],但显然你不拥有这个类。所以要获得更好的抽象。

3)正如Dinesh所说,[DataMember]上需要public Int32 MyValue { get; set; }

4)如果您通过添加服务引用来使用代码生成,您的方法将保留在服务器上并且永远不会离开它。但是如果你将你的实体(ThrowAway)分发给你的客户,他们就会这样做,这是一个很好的做法。记得!将接口,实体和实现分别放入单独的DLL中。