如何对外部依赖项使用依赖项注入?

时间:2011-09-22 15:09:29

标签: asp.net asp.net-mvc dependency-injection dependencies

我想我几乎得到了这个。

说我希望我的应用程序发送短信。但我还不确定我是否应该使用Twilio或SomeOtherSMSService。事实上,我真的不在乎。所以我有一些简单的东西,所以我可以继续开发我的应用程序。

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,这正是我应该帮助你避免的依赖注入:s。

这种做法是否正确?如果不是,你会怎么做?

请帮助。

2 个答案:

答案 0 :(得分:7)

这完全可以接受。您正在将TwilioRestClient的依赖关系从消费类中抽象出来。这样你就可以在你的控制器中投入FakeSMSService进行单元测试。你不应该对Twilio进行单元测试。

答案 1 :(得分:0)

在twillio博客上有一篇非常好的文章,我们没有为我们的项目使用mvc控制器,所以我们不能使用它,但是如果它可以帮助你的话,可以共享链接。

https://www.twilio.com/blog/2012/11/adding-dependency-injection-to-your-asp-net-mvc-twilio-app-using-mef.html

文章有点过头,但看起来很有用。