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