C# 减少耦合的简单技巧

C# 减少耦合的简单技巧,c#,C#,我有一个大型的.NET web应用程序。该系统有不同意图的项目(例如CMS、论坛、电子商务),我注意到调用另一个项目类的(天真)模式。例如,电子商务模块需要功能来为产品动态生成文件,我调用并引用CMS中的一个方法来实现这一点,因为文件处理实际上是CMS的一项工作 显然(我知道为什么),这是一个糟糕的设计和高耦合的情况 我知道一些处理高耦合的方法,比如重组项目(虽然我并不认为这是一个健壮的解决方案),但是我还能做些什么来减少高耦合呢?有什么简单的建议吗?此外,最好知道它们为什么/如何减少耦合。我使

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

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

我知道一些处理高耦合的方法,比如重组项目(虽然我并不认为这是一个健壮的解决方案),但是我还能做些什么来减少高耦合呢?有什么简单的建议吗?此外,最好知道它们为什么/如何减少耦合。我使用.NET3.5和SQLServer2005,所以像JMS这样的东西(我在搜索有关此设计问题的提示时经常遇到)不适用

谢谢


顺便说一句

我问这个问题的原因之一是,我已经阅读了之前类似的问题,但通常如果以前问过的问题再次被问到,不同的人在回复帖子时可以学到不同的技巧

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

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


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

您应该在其他项目需要的项目中公开web服务。这是SOA背后的基本概念。因此,我将创建web服务并使用它们,这将使您与现在的web服务有很大的分离。希望这能有所帮助。

嗯,我对.NET一无所知,但是如何将普通代码重构成一个独立的、底层的项目/层呢?web应用程序中的大量内容通常可以满足CMS、论坛和电子商务的需要,写入文件就是一个完美的例子


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

< P>我会考虑在紧耦合的片段上做“提取界面”重构。例如,如果使用CMS作为后备存储,则创建一个可以存储东西的接口,然后创建一个了解CMS的中介或适配器类,但将了解存储机制细节的逻辑隔离到该类

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


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

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

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

  • 按照其他人(接口等)的描述将适当的抽象放在适当的位置。反对抽象而不是具体化的程序
  • 如前所述,在设计类时要考虑依赖项注入
  • 在砖之间用灰泥作灰浆
  • 来自团队的信息补充了企业库

    斯科特·汉斯曼有一个很好的朋友