如何在使用外部依赖项时进行依赖注入?

6

我想我差不多明白了。

假设我想让我的应用程序发送短信。但我还不确定是否应该选择Twilio或其他一些短信服务。实际上,我现在并不在意。因此,我有一个简单的东西,这样我就可以继续开发我的应用程序。

public interface ISMSService{
    public bool SendMessage(string to, string message);
}

现在我想尝试使用Twilio。这就是让我困惑的地方。我可以将其安装为Nuget包,但我认为他们使用其REST API的C#包装器根本无法匹配我的接口..修改它似乎也不是一个好主意。
从自述文件中,我可以看到要使用它,我需要做类似于以下的事情。
var msg = twilio.SendSmsMessage("+15551112222", "+15553334444", "Can you believe it's this easy to send an SMS?!");

我的最佳猜测是应该将其包装在我自己的接口实现中。就像这样。
using Twilio;

public TwilioSMSService : ISMSService
{
    TwilioRestClient twilio;
    public TwilioSMSService()
    {
        twilio = new TwilioRestClient("accountSid", "authToken");

    }

    public bool SendMessage(string to, string message)
    {
        var msg = twilio.SendSmsMessage("+15551112222", to, message);
        if (msg != null) return true;
        return false;
        // this would obviously need more logic.
    }

我希望确保我在使用依赖注入原则,但是我感觉需要在默认构造函数中实例化TwilioRestClient,这似乎与依赖注入的初衷相悖。
这种方法是否正确?如果不是,你会怎么做?
请帮忙。
2个回答

8

这样做非常可行。您正在将TwilioRestClient的依赖性从消费类中抽象出来。这样,您可以在控制器中添加一个FakeSMSService进行单元测试。您不需要对Twilio进行单元测试。


完美。我只是想确保在构造函数中实例化TwilioClient对象不会出错...谢谢。 - nacho10f
1
你可以考虑将其放在try/catch块中。这样,如果它抛出异常,就不会对程序产生巨大的影响。 - Daniel A. White
Jamie,但是我怎么注入它呢?我对此没有控制。我不能实现一个接口来进行配置以便注入。 - nacho10f
但是对于 TwilioSMSService,难道不应该编写一个单元测试吗?而现在编写这样的单元测试将更加困难,因为类 TwilioRestClient 已经硬编码了。是否有一种方法可以仍然钩入启动类的服务以注入 TwilioRestClient 呢? - Yos

0

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