简单技巧降低耦合度

4
我有一个大型的.NET网页应用程序。该系统具有不同意图的项目(例如CMS,论坛,电子商务),我注意到了在另一个项目中调用类的(天真的)模式。例如,电子商务模块需要在产品上动态生成文件的功能,我调用并引用CMS中的方法来完成这个任务,因为文件处理确实是CMS的工作。
显然(我知道原因),这是糟糕的设计和高耦合的情况。
我知道几种处理高耦合的方法,比如重构项目(尽管我认为这不是一个稳健的解决方案),但除此之外,我还能做什么来减少高耦合?有什么简单的技巧吗?此外,了解它们为什么/如何减少耦合也很好。我使用的是.NET 3.5和Sql Server 2005,因此像JMS这样的东西(我在寻找有关这个设计问题提示的搜索中不断遇到)不适用。
谢谢
顺便说一下,
我提出这个问题的原因之一是我已经阅读了与此类似的先前问题,但通常如果再次提出以前提出过的问题,不同的人回复帖子可能会学到不同的技巧。
我知道依赖注入/IOC,但我对可以减少耦合的小技巧感兴趣。
在决定如何减少耦合时,我该如何选择使用静态类、接口派生类还是IOC方法?此外,我可以开发一个Web服务,它可以调用一个静态类-混合使用我的解决方案中的方法。
有趣的是,在我的应用程序中,我不希望它是不连贯的。因此,我只有一个论坛,电子商务系统和任何其他所需的模块,但每个模块(在我的Visual Studio解决方案中表示为专用项目)都需要了解并与其他模块一起工作。因此,例如,我可能会有一个处理用户配置文件的模块(与ASP.NET成员资格,角色等一起工作),但这将与论坛模块一起工作,因为论坛上的用户将是站点上注册用户(整个过程中只需要一次登录),他或她的配置文件将来自用户配置文件模块。这与我在其他网站上看到的单独配置文件不同)。
5个回答

4

您应该在那些将被其他项目需要的项目中公开Web服务。这是SOA背后的基本思想。因此,我会创建Web服务并使用它们,这将使您与现有方式相当脱钩。希望这可以帮到您。


4
我建议从紧密耦合的部分开始进行“提取接口”的重构。例如,如果使用CMS作为后备存储器,请创建一个可以存储东西的接口,然后创建一个中介或适配器类,该类知道CMS,但将知道存储机制细节的逻辑隔离到只有该类中。
然后,对于测试,您可以轻松地替换不依赖于CMS的内存存储或本地文件系统存储。
考虑使用依赖注入等技术(请参阅StructureMap、Spring.Net、NInject)来简化实例化,如果简单工厂不能给您所需的灵活性。

3
似乎您遇到了分层问题。您的组件应该只有一个依赖循环——从最不稳定到最稳定。这样可以更好地版本控制。一般而言,这个循环应该是UI(最不稳定)-> 领域核心(稳定)-> 数据访问(最稳定)。在此过程中,您可以加入工具或基础设施组件,但请记住它们应该比依赖于它们的组件更稳定。
我猜您的App.ECommerce和App.Cms组件应该是同级别的,而不是分层的。这意味着它们之间不应该有依赖关系,但这并不意味着您不能重用功能。对于您的情况,您需要将所需的功能下推到一个Core或Utilities组件中,使ECommerce和Cms都能够依赖它。如果是ECommerce提供的特定实现,则可以将接口或抽象基类推送到Core中,并让较高层(可能是IoC容器)将具体的Cms.FileCreator类连接到ECommerce.IFileCreator依赖项。

2
  1. 按照其他人所描述的方式建立适当的抽象(接口等)。针对抽象进行编程,而不是具体实现。
  2. 在设计类时考虑依赖注入。
  3. 使用控制反转容器作为砖块之间的灰浆。

Patterns & Practices团队的Unity与Enterprise Library相辅相成。

Scott Hanselman提供了一个很好的.NET控制反转容器列表


1

嗯,我不知道任何关于.NET的东西,但是将常见代码重构为单独的底层项目/层如何?Web应用程序中的许多内容可以通用地完成,以适应CMS、论坛和电子商务,写入文件就是一个完美的例子。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接