Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖项注入-如何基于值而不是类型解析依赖项?_C#_.net_Dependency Injection_Interface_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,.net,Dependency Injection,Interface,servicestack" /> servicestack,C#,.net,Dependency Injection,Interface,servicestack" />

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