减少耦合的简单技巧

时间:2008-11-22 20:07:19

标签: c#

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

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

我知道一些处理高耦合的方法,比如重组项目(尽管我并不认为这是一个强大的解决方案),但我还能做些什么来减少高耦合?任何简单的提示?此外,知道为什么/如何减少耦合会很好。我使用的是.NET 3.5和Sql Server 2005,所以像JMS这样的东西(我在寻找这个设计问题的提示时不断遇到)不适用。

由于


顺便说一句,

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

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

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

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

5 个答案:

答案 0 :(得分:4)

您应该在其他项目需要的项目中公开Web服务。这是SOA背后的基础理念。所以,我只是创建Web服务并使用它们,这将使您与现在的方式相去甚远。希望这会有所帮助。

答案 1 :(得分:4)

我会考虑首先在紧密耦合的部分上进行“提取界面”重构。例如,如果使用CMS作为后备存储,则创建可以存储内容的接口,然后创建了解CMS的中介或适配器类,但将知道存储机制详细信息的逻辑隔离到该类。 / p>

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

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

答案 2 :(得分:3)

听起来你有分层问题。您的程序集应该具有单个依赖循环 - 从最不稳定到最稳定。这允许你合理地版本。通常,该周期将类似于UI(最不稳定) - >域核心(稳定) - >数据访问(最稳定)。你可以沿途投入一个实用工具或一些基础设施组件,但是再次 - 它们应该被认为比依赖它们的组件更稳定。

我猜你的App.ECommerce和App.Cms程序集比图层更多兄弟 - 所以你不希望那些彼此依赖,但这并不意味着你不能重用功能。对于您的特定方案,您需要将所需的功能推送到ECommerce和Cms可以依赖的Core或Utilities程序集。如果它是ECommerce提供的特定实现,那么您可以将接口或抽象基类推送到Core - 并且具有更高层(可能是IoC容器)将具体的Cms.FileCreator类连接到ECommerce.IFileCreator依赖项。

答案 3 :(得分:2)

  1. 按照其他人(界面等)的描述获得适当的抽象。反对抽象的计划,而不是结核。
  2. 正如您所描述的那样,设计依赖于注入依赖注入的类。
  3. 使用Inversion of Control Container作为砖块之间的灰浆。
  4. 来自Unity小组的

    Patterns & Practices补充了企业库。

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

答案 4 :(得分:1)

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

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