1

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

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

现在,我编写了一个如下所示的方法:

public IPerson GetPeron(int idNumber);

此方法获取一个 ID 号并在 DB 中查找该号码。如果该号码属于一个人,则会创建一个新的 Man 实例,将数据库中的数据放入新实例中,最后实例返回。如果给定的 ID 属于女性,情况也是如此

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

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

A. 获取一个 ID 并返回一个代表人员类型的枚举:

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

B. 获取一个 ID 并返回一个 Man:

Man GetMan(int personID);

C. 获取一个 ID 并返回一个女人:

Woman GetWoman(int personID);

我觉得这很糟糕,有更好的建议吗?

4

2 回答 2

1

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

我想到的最好的方法是创建辅助的 wcf 可接口的具体类以用于 WCF 合同以及我需要在它们的实例和相应的业务类之间进行隐式转换的运算符。

于 2013-07-18T17:00:14.493 回答
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将被声明为 type BasePerson,但对象的实际类型将是Manor Woman

于 2013-07-18T16:54:02.540 回答