2016-03-21 8 views
1

変数に保存された国コードに基づいてUnity DIコンテナを使用してクラスを動的にロードしたいとします。私のシナリオでUnityを実装してクラスを動的にロードする方法

私たちの勝利アプリはUPS、FedEx、Purolatorのようなサードパーティの企業が開発したWebサービスを使用する出荷機能を備えています。

変数に格納された国コードに基づいて出荷クラスをロードできるように、コードを1つに設計するにはどうすればよいですか?

これは私のサンプルや提案クラスのデザインであると仮定します。

public interface IShip 
    { 
     string Ship(); 
    } 

    public class UPS : IShip 
    { 
     public string Ship() 
     { 
     } 
    } 

    public class FedEX : IShip 
    { 
     public string Ship() 
     { 
     } 

    } 

    public class Purolator : IShip 
    { 
     public string Ship() 
     { 
     } 

    } 

にはどうすれば変数の値に基づいて、クラスをロードするために団結を使用することができます。

GBが変数に格納されていて、UPSクラスをロードして船機能を呼び出す場合はどうなりますか?

変数にFRが格納されていて、UPSクラスをロードして船機能を呼び出したいとしますか?

USが変数に格納されていて、FedExクラスを読み込み、ship関数を呼び出したいとしますか?

変数にCAが格納されていて、Purolatorクラスを読み込み、ship関数を呼び出したいとしますか?

+0

あなたはIShipのかかるコードを表示することができますか? –

+0

私の考えからのクラスデザイン。コードが開始されていません。私は実行時に提供された国コードに基づいてクラスを動的にロードする単一性DIを使用する方法を知りたい。 – Thomas

+0

使用インターフェイスでの複数の実装の名前付き登録。同様の[回答はこちら](http://stackoverflow.com/a/23669951/881798)。 – vendettamit

答えて

2

あなたの条件に応じて、名前によって、あなたのクラスを登録し、それらを解決することができます

container.RegisterType<IShip, UPS>("UPS"); 
container.RegisterType<IShip, FedEX>("FedEX"); 
container.RegisterType<IShip, Purolator>("Purolator"); 

public IShip GetShippment(string c) 
{ 

    if (c == "GB" || c == "FR") 
     return container.Resolve<IShip>("UPS"); 

    if (c == "US") 
     return container.Resolve<IShip>("FedEX"); 

    if (c == "CA") 
     return container.Resolve<IShip>("Purolator"); 

    throw new NotImplementedException(); 
} 
... 
var shippment = GetShippment("CA"); 
shippment.Ship(); 
+0

あなたのコードはありがたいですが、船舶の機能を呼び出す方法を示していませんでした。ありがとう – Thomas

+0

@トーマスは単に 'Ship'メソッドを呼び出す – Backs

+0

私はあなたのコードをテストし、あなたに知らせます。ありがとうたくさん:) – Thomas

関連する問題