“编码到接口”和业务实体的最佳实践?

时间:2011-03-23 17:58:34

标签: design-patterns class-design

是否应使用接口和/或基类抽象出业务实体,以便在传递它们时只使用接口/基类? (这就是我们一直在做的事情。)

或者不应使用接口抽象实体,只有在必要时才应使用继承?

我问这个问题的原因是,我总是尽可能地使用接口抽象出应用程序代码的所有部分。这使我很容易使用模拟等执行单元测试。此外,通过使用接口,我可以确保只有工厂类实际引用包含实现的项目和所有其他项目(例如:业务逻辑层)仅引用包含所有接口的项目。

以上一直运作良好。但是现在,我们需要通过WCF公开我们的一些业务方法。用于返回接口的业务方法,但现在我正在尝试重用相同的方法并通过WCF公开它,WCF不喜欢我正在使用并返回接口作为服务方法参数的一部分这一事实。

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

所以我想知道在新项目中是否有最佳实践:您是否应该为所有业务实体提供接口?

1 个答案:

答案 0 :(得分: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;
    }
}

我不确定您是否可以对接口使用相同的方法,因为它需要静态方法实现。