在wcf中序列化接口

时间:2013-07-18 16:31:11

标签: .net wcf interface

我设计了一个具有接口和两个继承类的应用程序:

interface IPerson {}
class Man:IPerson{}
class Woman:IPerson{}

现在,我写了一个看起来像这样的方法:

public IPerson GetPeron(int idNumber);

此方法获取ID号并在DB中查找该号码。如果该数字与人类相似,则会创建一个新的Man实例,将来自DB的数据放入新实例,最后返回实例。如果给定的ID属于女性,则同样如此

现在我希望该方法不是放在客户端,而是放在WCF服务器上。问题是返回类型不再是接口。

显而易见的解决方案是创建三种方法:

一个。获取ID并返回表示人员类型的枚举:

enum PersonType { Man,Woman }
PersonType GetType(int personID);

B中。获取一个ID并返回一个Man:

Man GetMan(int personID);

℃。获取一个ID并返回一个女人:

Woman GetWoman(int personID);

我认为那是一种糟糕的,更好的建议吗?

2 个答案:

答案 0 :(得分:1)

如果它真的像这个例子一样简单(没有涉及多个实现或其他基类),那么基类代替(或除了)接口就可以工作:

public interface IPerson { }

[KnownType(typeof(Man))]
[KnownType(typeof(Woman))]
public class BasePerson : IPerson { }

public class Man : BasePerson { }
public class Woman : BasePerson { }

[OperationContract]
BasePerson GetPerson(int value);

您的代理将生成基类和具体类,因此当您致电:

var x = proxy.GetPerson(3);

x将被声明为BasePerson类型,但对象的实际类型可以是ManWoman

答案 1 :(得分:1)

不幸的是,在使用WCF时,如果没有默认(空)构造函数,则无法使用接口,抽象基类或类。这让我感到困扰,但你必须在WCF和良好的OO实践之间做出选择......

我遇到的最好的方法是创建辅助 wcf-interfaceable 具体类,以便在WCF契约和我需要的运算符之间隐式转换它们的实例和相应的业务课程。