2017-05-25 9 views
3

私が持っている一つのインタフェースと、以下のように自分のアプリケーションで(そのインターフェイスから実装された)二つのクラス:依存性注入 - 値に基づいて依存関係を解決するにはどうすればいいですか?

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には2つの異なる型を同時に登録することはできません。

実行時にNexmoまたはTwilioのいずれかのプロバイダクラスを使用するために、以下の構造でどのような変更が必要なのでしょうか?

答えて

4

あなただけのインターフェイスごと単一登録を持っているか、そう、この登録を入力することができます:あなたがインターフェイスから解決したときに

container.RegisterAutoWiredAs<TwilioProvider, ISMSServiceProvider>(); 

は例えば、TwilioProviderのインスタンスを返します。

var smsProvider = container.Resolve<ISMSServiceProvider>(); 

両方のタイプを登録できるようにするには、具体的なタイプに対して登録することができます。例:

あなたが列挙型を使用して解決したい場合は、例えば、工場を登録することができ

var twilio = container.Resolve<TwilioProvider>(); 
var nexmo = container.Resolve<NexmoProvider>(); 

:210

はで解決

あなたとあなたのサービスに注入することができ
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); 
+0

あなたのお返事ありがとうございますmythz ...私は、このシナリオではFactoryソリューションがより賢明に見えると思います。 "HostConfig"を取得するために私がインストールする必要があるパッケージがどれだけあるのだろうか?私はServiceStackを使用しています。3.9.48 – Nirman

+0

@Nirman ServiceStackの最新のv4を参照している 'servicestack'ハッシュタグを使用するときは、[servicestack-bsdタグを使用する必要があります](https://github.com/ servicestackv3/servicestackv3#support)を使用してServiceStack v3を参照します。あなたは 'AppHostBase.Instance.Resolve 'などを使うことができるはずですが、覚えていないはずです。 – mythz

+1

ありがとう、その "AppHostBase.Resolve"はv3で動作します。適切な実装で私を助けることにあなたの助けを感謝します。ありがとうございました – Nirman

関連する問題