依赖注入 - 如何根据值解析依赖关系而不是键入?

时间:2017-05-25 05:30:32

标签: c# .net dependency-injection interface servicestack

我的应用程序中有一个接口和两个类(从该接口实现),如下所示:

public interface ISMSServiceProvider
{
    NotificationSentResponse Send(SMSMessage sms);
}

public class NexmoProvider: ISMSServiceProvider
{
    NotificationSentResponse Send(SMSMessage sms);
}

public class TwilioProvider: ISMSServiceProvider
{
    NotificationSentResponse Send(SMSMessage sms);
}

在我的应用程序的某些地方,我需要使用NexmoProvider,并在某些地方使用TwilioProvider。这是根据以下枚举变量的值决定的:

public enum NotificationProvider
{   
    Twilio = 1,
    Nexmo = 2
}

我在我的应用程序中使用服务堆栈,并使用以下代码来解决依赖关系:

container.RegisterAutoWiredAs<TwilioProvider, ISMSServiceProvider>();

但正如您所看到的,ISMSServiceProvider中没有任何内容可以让我同时注册两种不同的类型。

有人可以建议我在下面的结构中做些什么改变,以便我在运行时使用Nexmo或Twilio提供程序类吗?

1 个答案:

答案 0 :(得分:4)

每个接口或类型只能进行单个注册,因此注册:

container.RegisterAutoWiredAs<TwilioProvider, ISMSServiceProvider>();

当您从界面解析时,将返回TwilioProvider的实例,例如:

var smsProvider = container.Resolve<ISMSServiceProvider>();

如果您希望能够注册这两种类型,可以根据具体类型进行注册,例如:

container.RegisterAutoWired<TwilioProvider>();
container.RegisterAutoWired<NexmoProvider>();

已解决:

var twilio = container.Resolve<TwilioProvider>();
var nexmo = container.Resolve<NexmoProvider>();

如果您想使用Enum解析,可以注册工厂,例如:

public class SmsFactory
{
    public ISMSServiceProvider Resolve(NotificationProvider provider) =>
        provider == NotificationProvider.Twilio 
            ? HostConfig.Resolve<TwilioProvider>()
            : HostConfig.Resolve<NexmoProvider>();
}

container.Register(c => new SmsFactory());

您可以在服务中注入:

public SmsFactory SmsFactory { get; set; }

然后正常使用,即:

var smsProvider = SmsFactory.Resolve(NotificationProvider.Twilio);