我正在阅读 Loose Coupling 及其好处,这些都是非常好的东西,但我开始想知道哪些工具非常适合创建松散耦合的解决方案?首先我想到的是类型和接口以及抽象类,但我确信有很多方法可以提供松散耦合。也许多态有助于创建松散耦合的对象和系统。
谢谢。
我正在阅读 Loose Coupling 及其好处,这些都是非常好的东西,但我开始想知道哪些工具非常适合创建松散耦合的解决方案?首先我想到的是类型和接口以及抽象类,但我确信有很多方法可以提供松散耦合。也许多态有助于创建松散耦合的对象和系统。
谢谢。
这是一个非常广泛的问题——可能太宽泛而无法回答。
但是,可以提供“松耦合”解决方案的两种方法是:
依赖注入
依赖注入(尤其是在使用控制容器反转时)在应用程序或解决方案中提供松散耦合 - 使用依赖注入,您无需对依赖对象的引用进行硬编码,而是对接口进行编码并注入这些接口的实现。
这是应用程序的 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");
}
}
服务导向
面向服务在解决方案的不同子系统之间提供松散耦合 - 使用面向服务,解决方案的每个部分都成为其自己的独立服务,发布和接口(通常是基于消息传递的接口)。
这意味着应用程序在需要与解决方案的运输子系统进行通信时,只需要了解系统接口及其地址,而无需了解其内部实现的任何信息。这几乎可以看作是基本 OO 原则的更广泛应用。
这两者都提供了两种不同类型的松散耦合(这是您的问题的问题之一,它本身的术语是松散定义的)
大概是你的大脑?
考虑到接口的程序。将您的库构建为具有最少和显式接口的自包含代码的小岛。限制所有符号的范围,尤其是可变符号(例如变量)。不要泄露实现细节,除非它们是相关的。
其他人已经提供了很好的答案,但我想补充一个想法:使用继承实现的多态性不会促进松散耦合。继承是基类和派生类之间非常强的耦合。
MEF 是松耦合的最佳工具!从一开始就将您的应用程序设计为对 MEF/插件非常友好,您会发现您的应用程序将非常松散耦合
迄今为止最好的工具是Microsoft CAB(包括前面提到的 Unity 框架)
,它包括依赖注入、松散耦合事件处理等工具。
松散耦合的一个好方法是依赖注入。