【问题标题】:Simple tips to reduce coupling减少耦合的简单技巧
【发布时间】:2008-11-22 20:07:18
【问题描述】:

我有一个大型 .NET Web 应用程序。该系统具有用于不同意图的项目(例如 CMS、论坛、电子商务),我注意到调用另一个项目的类的(幼稚)模式。例如,电子商务模块需要为产品动态生成文件的功能,我调用并引用 CMS 中的一个方法来执行此操作,因为文件处理实际上是 CMS 的工作。

显然(我知道为什么),这是一个糟糕的设计和高耦合的情况。

我知道一些处理高耦合的方法,比如重组项目(虽然我并不认为这是一个强大的解决方案),但我还能做些什么来减少高耦合?有什么简单的小窍门吗?此外,最好知道它们为什么/如何减少耦合。我使用 .NET 3.5 和 Sql Server 2005,因此 JMS(我在搜索有关此设计问题的提示时不断遇到)之类的东西不适用。

谢谢


顺便说一句,

我提出这个问题的原因之一是我已经阅读了与此类似的先前问题,但通常如果再次提出之前提出的问题,则可以通过不同的人回复帖子来学习不同的提示。

我知道依赖注入/IOC,但我对可以减少耦合的小事情很感兴趣。

在决定如何减少耦合时,我该如何选择使用静态类、接口派生类或 IOC 方法?此外,我可以开发一个可以调用静态类的 Web 服务——在我的解决方案中混合这些方法。

有趣的是,在我的应用程序中,我不希望它脱节。所以我只有一个论坛、电子商务系统和任何其他所需的模块,但一切都必须整合到一个站点中,因此每个模块(在我的 Visual Studio 解决方案中表示为一个专用项目)需要了解所有其他模块和工作用它。例如,我可能有一个处理用户配置文件的模块(使用 ASP.NET 成员资格、角色等),但这将与论坛模块一起使用,因为论坛上的用户将是网站上的注册用户(一个整个登录),他或她的个人资料将来自用户个人资料模块。这与我在其他网站上看到的单独的个人资料相反)。

【问题讨论】:

    标签: c#


    【解决方案1】:

    您应该在其他项目需要的项目中公开 Web 服务。这是 SOA 背后的基本理念。因此,我将创建 Web 服务并使用它们,这将使您与现在拥有它的方式脱钩。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我会考虑首先对紧密耦合的部分进行“提取接口”重构。例如,如果使用 CMS 作为后备存储,创建一个可以存储东西的接口,然后创建一个了解 CMS 的中介器或适配器类,但将了解存储机制细节的逻辑隔离到该类。

      然后,为了进行测试,您可以轻松替换不依赖于 CMS 启动的内存存储或本地文件系统存储。

      如果简单的工厂无法为您提供所需的灵活性,请考虑使用依赖注入等技术(请参阅 StructureMap、Spring.Net、NInject)来简化实例化。

      【讨论】:

        【解决方案3】:

        听起来你有分层问题。您的程序集应该有一个依赖循环——从最不稳定到最稳定。这使您可以明智地进行版本控制。通常,该循环类似于 UI(最不稳定)-> 域核心(稳定)-> 数据访问(最稳定)。您可以在此过程中添加实用程序或一些基础设施程序集,但同样 - 它们应该被认为比依赖它们的程序集更稳定。

        我猜你的 App.ECommerce 和 App.Cms 程序集是兄弟而不是层 - 所以你不希望它们相互依赖,但这并不意味着你不能重用功能。对于您的特定场景,您需要将所需的功能下推到电子商务和 Cms 都可以依赖的核心或实用程序程序集。如果它是 ECommerce 提供的特定实现,那么您可以将接口或抽象基类推送到核心 - 并让更高层(可能是 IoC 容器)将具体的 Cms.FileCreator 类连接到 ECommerce.IFileCreator 依赖项。

        【讨论】:

          【解决方案4】:
          1. 按照其他人的描述(接口等)获取适当的抽象。针对抽象而非具体化的程序。
          2. 如您所述,在设计类时考虑到依赖注入。
          3. 使用Inversion of Control Container 作为砖块之间的砂浆。

          Patterns & Practices 团队的Unity 补充了企业库。

          Scott Hanselman 有一个很好的List of .NET Inversion of Control Containers

          【讨论】:

            【解决方案5】:

            好吧,我对 .NET 一无所知,但是如何将通用代码重构为一个单独的底层项目/层? Web 应用程序中的大量内容可以通用地完成以适应 CMS、论坛和电子商务,写入文件就是一个很好的例子。

            另一种方法是将论坛和电子商务视为 CMS 中的模块,这也是有意义的。然后他们可以安全地使用 CMS 的指定 API。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-26
              相关资源
              最近更新 更多