静态物料的松散耦合

Tom*_*han 3 c# static abstraction dependency-injection

我有一个类,ClassA它使用我编写的客户端发送短信,TextClient通过调用静态方法发送一些短信

TextClient.Send(string text, string destination)
// where destination is a phone number
Run Code Online (Sandbox Code Playgroud)

但是,我还有一个邮件客户端类MailClient,它发送具有相同签名的电子邮件:

MailClient.Send(string text, string destination)
// where destination is an email address
Run Code Online (Sandbox Code Playgroud)

我想"注入"应该使用哪些客户端 - 这可能吗?

(注意:我知道当对于哪些值destination可以保持并被认为有效时有完全不同的规则可能会出现问题,但是这些值是从其他地方获取的,所以这个类不需要打扰.这就是为什么我我想首先把它抽象出来.)

Jon*_*eet 7

基本上,摆脱静态方法.创建一个接口(IMessageClient),然后使用实现该接口的实例方法实现两个实现(TextClientMailClient).然后,您可以轻松地将适当的IMessageClient注入到应用程序的其余部分.

你当然可以使用委托来避免在这里创建接口 - 但我肯定会改为使用接口:

  • 涉及的名称(接口名称,方法名称和参数名称)在您使用它们时传达信息
  • 它允许在同一界面中使用多种方法
  • 它可以防止偶然使用具有相同参数类型但完全不相关的意义的方法