【问题标题】:Do I violates Common Closure Principle(CCP)我是否违反了共同封闭原则(CCP)
【发布时间】:2014-10-12 05:36:38
【问题描述】:

我有以下 dll 的应用程序:

Web 项目 - MVC Web 应用程序

Wcf 服务 - Web 应用程序使用的服务。

模型 - 实体框架代码优先实体和 DbContext 对象。

现在,当我需要更改某些内容时,可以说 wcf 服务中的功能,因此我更改了功能,但 Web 也受到影响,我需要再次添加服务引用并更改使用 wcf 服务的代码以及模型有时变化...

正如 CCP 所说:更改包的理由不应该超过一个。如果更改发生在依赖于多个包的应用程序中,理想情况下,我们只希望更改发生在一个包中,而不是多个包中。 这有助于我们确定可能更改的类,并将它们打包在一起,原因相同。如果类是紧耦合的,请将它们放在同一个包中。

所以在我的设计中我违反了这个原则?如果有人能解释更好的设计,我会很高兴。

【问题讨论】:

  • 这是一个常见的解决方案结构,是的,它会违反这个原则。另一种方法是将每个关注点(比如说管理用户)放在一起——这将包括模型、存储库、控制器……但我认为在.net 中,你所做的“层”模型仍然是最常见的模型,所以坚持与它国际海事组织
  • 显然,无论何时更改接口,都必须更改其实现以及调用者使用它的方式。
  • 你说得对,这违反了 CCP,因为一个 dll 的变化会导致其他 dll 的变化......我的问题是有更好的设计,如果没有,我们需要在什么情况下使用 CPP 原则?
  • CCP 原则是指horizo​​ntal 包内聚,而不是垂直内聚,即将通用功能拆分为多个单独的包,供同一个调用者使用。如果您的包依赖于多个包,那么您应该只需要更改一个,前提是您要更改一个功能。如果您需要添加涉及新数据架构、新业务逻辑和新表示的新功能,当然您将在应用程序周围进行更改。

标签: c# .net design-patterns package-design


【解决方案1】:

WCF 服务包含 WSDL 定义,它是使用其功能的契约,也为它定义实体。您需要再次添加参考的一个可能原因是您正在更改此合同。 有关更多信息,请在此处查看: http://msdn.microsoft.com/en-us/library/aa738723(v=vs.110).aspx

【讨论】:

  • 是的,我知道我的意思是,如果您更改 wcf 接口,它会影响其他 dll 并违反 CCP 原则...
  • 您可以使用两种单独的解决方案:一种用于 mvc 项目及其所有相关程序集,另一种用于服务部分。使用此设计将对您的情况有所帮助。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2010-10-08
  • 2018-06-11
相关资源
最近更新 更多