Design patterns “最佳实践”;“接口编码”;和商业实体?

Design patterns “最佳实践”;“接口编码”;和商业实体?,design-patterns,class-design,Design Patterns,Class Design,业务实体是否应该使用接口和/或基类进行抽象,以便在传递它们时只使用接口/基类?(这就是我们一直在做的事情) 或者不应该使用接口抽象实体,而应该仅在必要时使用继承 我问这个问题的原因是,我总是尽可能使用接口抽象出应用程序代码的所有部分。这使得我可以轻松地使用mock等执行单元测试。此外,通过使用接口,我可以确保只有工厂类实际引用了包含实现的项目,而所有其他类(例如:业务逻辑层)仅引用了包含所有接口的项目 到目前为止,上述措施效果良好。但是现在,我们需要通过WCF公开我们的一些业务方法。业务方法用于

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

或者不应该使用接口抽象实体,而应该仅在必要时使用继承

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

到目前为止,上述措施效果良好。但是现在,我们需要通过WCF公开我们的一些业务方法。业务方法用于返回接口,但现在我尝试重用同一方法并通过WCF公开它,WCF不喜欢我将接口作为服务方法参数的一部分使用和返回

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


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

您实际上可以告诉WCF跨线使用您的接口,因此这不是问题

它是“添加服务引用”对话框中的一个设置

您需要的是“在引用的程序集中重用类型”选项

您希望确保您的合同在导线的两端都被使用,因此您需要确保您已选择重用引用程序集,并且您需要确保您的程序集位于引用程序集列表中

要绕过必须了解子类的基类,可以执行以下操作:

[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;
    }
}

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

当您返回实际类作为WCF实现的一部分时,这是有效的。但当您返回或使用接口作为方法签名的一部分时,您最终不得不使用KnownTypeAttribute来装饰大量代码,这就是我的问题所在。(此外,除了手动检查类之外,没有简单的方法添加KnownTypeAttribute)@Rajah我明白你的意思,我将用一种方法更新我的答案,我已经看到许多人建议不要使用业务实体上的接口。通过网络发送您的业务实体也可能是一个坏主意。