我设计了一个具有接口和两个继承类的应用程序:
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);
我认为那是一种糟糕的,更好的建议吗?
答案 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
类型,但对象的实际类型可以是Man
或Woman
。
答案 1 :(得分:1)
不幸的是,在使用WCF时,如果没有默认(空)构造函数,则无法使用接口,抽象基类或类。这让我感到困扰,但你必须在WCF和良好的OO实践之间做出选择......
我遇到的最好的方法是创建辅助 wcf-interfaceable 具体类,以便在WCF契约和我需要的运算符之间隐式转换它们的实例和相应的业务课程。