2011-03-23 64 views
0

应该使用接口和/或基类将业务实体抽象出来,以便当你传递它们时只使用接口/基类? (这是我们一直在做的)。“接口编码”和业务实体的最佳实践?

还是应该实体不使用的接口抽象并只在必要时应该使用的传承?

我之所以问这个问题,是我一直尽量抽离使用接口的我的应用程序代码的所有部分。这使得我可以很容易地使用mock等进行单元测试。另外,通过使用接口,我可以确保只有工厂类实际引用包含实现的项目以及所有其他项(例如:业务逻辑层)该项目包含所有的接口。

上述工作一直很好,直到现在。但是现在,我们需要通过WCF公开一些业务方法。用于返回接口的业务方法,但现在我试图重复使用相同的方法并通过WCF公开它,WCF不喜欢我使用和返回接口作为服务方法参数一部分的事实。

现在我可以尝试使用KnownTypes和ServiceKnownTypes解决问题,但它让我想如果我没有为我的应用程序的业务实体部分使用接口,我不会遇到这个问题。

所以我想如果有一个最好的做法,当涉及到一个新的项目:如果您或你应该不会有你的所有业务实体的接口?

+0

我见过很多人推荐针对商业实体的接口。并且通过电线发送您的商业实体也可能是一个坏主意。 – driushkin 2011-03-24 17:14:55

回答

1

实际上,你可以告诉WCF使用跨线你的接口,所以它不是一个问题。

这是添加服务引用对话框中的设置。

什么你要找的是选项“中引用组件重用类型”。

你要确保你的合同正在上线的两端用,所以你需要确保你选择重用引用程序集,你需要确保你的组件在引用程序集列表。

http://msdn.microsoft.com/en-us/library/bb514724.aspx

为了避开不必知道有关的子类,你可以做这样的事情的基类:

[KnownType("GetKnownTypes")] 
public abstract class Shape 
{ 
    static Type[] GetKnownTypes() 
    { 
     //do some reflection here to look up all classes that extend Shape 
     //and are serializable 
     return results; 
    } 
} 

我不知道,你可以用同样的方法为一个接口,因为它需要有一个静态方法实现。

+0

当您将实际的类作为WCF实现的一部分返回时,此工作正常。但是当你返回或使用接口作为你的方法签名的一部分时,你最终必须用KnownTypeAttribute来修饰大量的代码,这就是我的问题所在。 (此外,除了手动检查类之外,没有简单的方法来添加KnownTypeAttribute) – 2011-03-23 20:49:38

+0

@Rajah我明白你的意思,我会用一种方法更新我的答案 – Joseph 2011-03-24 16:49:02