我的应用程序中有一个接口和两个类(从该接口实现),如下所示:
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);