C# 依赖项注入-如何基于值而不是类型解析依赖项?
我的应用程序中有一个接口和两个类(从该接口实现),如下所示:C# 依赖项注入-如何基于值而不是类型解析依赖项?,c#,.net,dependency-injection,interface,
servicestack,C#,.net,Dependency Injection,Interface,
servicestack,我的应用程序中有一个接口和两个类(从该接口实现),如下所示: public interface ISMSServiceProvider { NotificationSentResponse Send(SMSMessage sms); } public class NexmoProvider: ISMSServiceProvider { NotificationSentResponse Send(SMSMessage sms); } public class TwilioPro
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>();
container.RegisterAutoWiredAs();
但正如您所看到的,ISMSServiceProvider中没有任何内容允许我同时注册两种不同的类型
有谁能建议我需要在下面的结构中做些什么更改,以使我能够在运行时使用Nexmo或Twilio提供程序类吗?每个接口或类型只能有一个注册,因此此注册:
container.RegisterAutoWiredAs<TwilioProvider, ISMSServiceProvider>();
如果您希望能够注册这两种类型,可以针对具体类型进行注册,例如:
container.RegisterAutoWired<TwilioProvider>();
container.RegisterAutoWired<NexmoProvider>();
然后正常使用,即:
var smsProvider = SmsFactory.Resolve(NotificationProvider.Twilio);
谢谢你的回复mythz。。。我认为工厂解决方案在这种情况下看起来更合理。只是想知道我需要安装什么包才能获得“HostConfig”?我正在使用ServiceStack 3.9。48@Nirman当您使用
servicestack
哈希标记时,您指的是servicestack的最新v4,您需要指的是servicestack v3。您应该能够使用AppHostBase.Instance.Resolve
或类似的东西,我不记得了。谢谢,它的“AppHostBase.Resolve”在v3中工作。感谢您帮助我正确实施。非常感谢。
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);