我正在阅读关于松耦合及其优点的相关内容,这些都是非常好的东西,但我开始想知道有哪些工具可以创建松散耦合的解决方案?首先,我想到了类型、接口和抽象类,但我相信还有很多提供松散耦合的方法。也许多态性有助于创建松散耦合的对象和系统。
谢谢。
谢谢。
这是一个非常广泛的问题,可能太过宽泛以至于无法回答。
然而,两种可以提供“松耦合”解决方案的方法是:
依赖注入
依赖注入(特别是使用控制反转容器时)为应用程序或解决方案提供了松耦合性——使用依赖注入时,您不会将对相关对象的引用硬编码,而是编写接口并注入这些接口的实现。
下面是一个 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");
}
}
服务导向
服务导向提供了解耦的功能,使得解决方案中不同子系统之间的耦合度降低。通过服务导向,解决方案中的每个部分都成为自己独立的服务,发布并提供接口(通常是基于消息的接口)。
这意味着当应用程序需要与解决方案中的货运子系统进行通信时,只需要知道系统接口和其地址,而不需要了解其内部实现。这可以看作是基本面向对象原则的更广泛应用。
这两种方式都提供了不同类型的解耦(这也是你问题的一个问题,因为该术语本身定义模糊)。
您的大脑?
以接口为导向进行编程。将库构建为自包含代码的小岛,具有最小和明确的接口。限制所有符号的范围,特别是可变符号(例如变量)。除非相关,否则不要透露实现细节。
其他人已经提供了很好的答案,但我想再补充一点:使用继承实现的多态并不促进松耦合。继承是基类和派生类之间非常强的耦合。
MEF是最好的松耦合工具!从一开始就设计你的应用程序,使其非常MEF/插件友好,你会发现你的应用程序将非常松散耦合。