C#中最好的松耦合工具是什么?

4
我正在阅读关于松耦合及其优点的相关内容,这些都是非常好的东西,但我开始想知道有哪些工具可以创建松散耦合的解决方案?首先,我想到了类型、接口和抽象类,但我相信还有很多提供松散耦合的方法。也许多态性有助于创建松散耦合的对象和系统。
谢谢。
7个回答

14

这是一个非常广泛的问题,可能太过宽泛以至于无法回答。

然而,两种可以提供“松耦合”解决方案的方法是:

依赖注入

依赖注入(特别是使用控制反转容器时)为应用程序或解决方案提供了松耦合性——使用依赖注入时,您不会将对相关对象的引用硬编码,而是编写接口并注入这些接口的实现。

下面是一个 Logging 组件的快速代码示例,它实现了 ILogger 接口:

public class ConcreteLogger : ILogger
{

    public LogMessage(string message)
    {
        Log.Write(message);
    }
}

其中一个您的类接收此日志记录器接口的具体实现。

public class MyClass
{
    private ILogger logger;

    public myClass(ILogger logger)
    {
        this.logger = logger;
    }

    public void DoSomething()
    {
        // Now if DoSomething needs to call logging it can call what ever ILogger was passed in
        this.logger.Log("We did something");
    }
}

服务导向

服务导向提供了解耦的功能,使得解决方案中不同子系统之间的耦合度降低。通过服务导向,解决方案中的每个部分都成为自己独立的服务,发布并提供接口(通常是基于消息的接口)。

这意味着当应用程序需要与解决方案中的货运子系统进行通信时,只需要知道系统接口和其地址,而不需要了解其内部实现。这可以看作是基本面向对象原则的更广泛应用。


这两种方式都提供了不同类型的解耦(这也是你问题的一个问题,因为该术语本身定义模糊)。


这也是我所想的,但我不知道它被称为依赖注入。谢谢你澄清了事情。顺便说一句,非常有用的答案。举例说明使它更易于理解。 - Tarik
1
很高兴我给了你一个起点 - 我有点依赖注入上瘾,当我开始使用它时,它真的为我的设计打开了许多可能性。也要调查一下IOC容器,它们可以处理依赖注入的重活。 - David Hall

2

您的大脑?

以接口为导向进行编程。将库构建为自包含代码的小岛,具有最小和明确的接口。限制所有符号的范围,特别是可变符号(例如变量)。除非相关,否则不要透露实现细节。


2

其他人已经提供了很好的答案,但我想再补充一点:使用继承实现的多态并不促进松耦合。继承是基类和派生类之间非常强的耦合。


1
  • 良好的面向对象设计
  • 接口的使用
  • 控制反转(例如Microsoft.Practices.Unity或Windsor等)
  • 适当的设计模式(MVC,n-tier等)

1

MEF是最好的松耦合工具!从一开始就设计你的应用程序,使其非常MEF/插件友好,你会发现你的应用程序将非常松散耦合。


0

0
到目前为止最好的工具是Microsoft CAB(其中包括先前提到的Unity框架)
它包括依赖注入、松耦合事件处理等工具。

您提供的链接显示MS CAB属于“已退役”部分。这可能不是一个好建议? - Dave Archer
依赖注入在这里(http://msdn.microsoft.com/en-us/library/dd203101.aspx),而松散耦合的事件处理在这里(http://msdn.microsoft.com/en-us/library/dd458809.aspx)。它们是相同的东西,只是分开了。我不熟悉 CAB 的其他部分,但我相信所有内容都在“模式和实践”下。 - BlueRaja - Danny Pflughoeft

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