CodeGo.net>依赖注入-如何解决基于值,而不是类型的依赖关系?

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

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提供程序类吗?

解决方法:

每个接口或类型只能有一个注册,因此此注册:

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>();

如果要使用枚举解决问题,可以注册工厂,例如:

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);
上一篇:c#-服务栈-操作,验证和请求过滤器的顺序


下一篇:CodeGo.net>如何在ServiceStack自托管中设置静态文件的根路径