【问题标题】:Serializing interface in wcfwcf中的序列化接口
【发布时间】:2013-07-17 17:44:07
【问题描述】:

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

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

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

public IPerson GetPeron(int idNumber);

此方法获取一个 ID 号并在 DB 中查找该号码。如果该号码属于一个人,则会创建一个新的人实例,将数据库中的数据放入新实例中,最后实例返回。如果给定的 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);

我认为这有点糟糕,有更好的建议吗?

【问题讨论】:

  • 你应该尝试泛型,比如 public T GetPerson(int id) where T is IPerson and Iserializable

标签: .net wcf interface


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多