关于ZAKER 融媒体解决方案 合作 加入

CodeGo.net>依赖注入 - 如何解决基于值 , 而不是 .

CocoaChina 11-11

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

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

以上内容由"CocoaChina"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享