2010-11-21 3 views
3

私のアプリケーションにIOCを実装したいのですが、私のアプリケーションでは混乱しています。私はインターフェイスを実装する複数の具象クラスを持っています。基本的には複数のコンクリートタイプにIOCコンテナを使用する

  • AddAddress
  • AddContact
  • RemoveAddress
  • RemoveContact

- :

私はintefaceをICommandのを持っており、このインターフェイスを実装する具体的な種類を以下 - :このシナリオを考えてみましょうユーザーはUIでこのすべての操作を実行し、Listはサービスレイヤに渡されます。ここでeac hコマンドが実行されます。

だから、GUI層に私は、最終的にサービス層にlistOfCommandsを渡します

List<ICommand> listOfCommands = List<ICommand>(); 
listOfCommands.Add(command1); 
listOfCommands.Add(command2); 

コマンドマネージャで

ICommand command1 = new AddAddress(); 
ICommand command2 = new RemoveContact(); 

を書き込みます。

IOCの理解によれば、インタフェースにマッピングされる具体的なクラスは1つだけです。この構文を使用して、具体的な型をStructureMapコンテナから取得します。

ICommand command = ObjectFactory.GetInstance<ICommand>(); 

このシナリオでIOCを実装するにはどうすればよいですか?

答えて

0

ほとんどのIOCコンテナでは、インターフェイスの「名前付きインスタンス」を登録でき、それぞれ独自の一意の名前を持つICommandの実装をいくつか登録できます。 StructureMapでは、このようにそれらを要求:

ObjectFactory.GetNamedInstance<ICommand>("AddAddress"); 

はどのようにセットアップのStructureMap内のコンテナを参照するにはthis questionを見てください。このシナリオでは

3

あなたは値オブジェクトにあなたのコマンドを作る方がいいでしょう、IoCコンテナによって作成されたすなわちない:コマンドを作成する場合

class AddAddressCommand { 
    public AddAddressCommand(string address) { 
     Address = address; 
    } 
    public string Address { get; private set; } 
} 

、あなたは本当に、特定の実装をしたいですかIoCコンテナのサービスに対して動作する両方の懸念事項を正確にパラメータ化する必要があります。ある時点でコマンドオブジェクトをシリアル化することを決定した場合、これはさらに重要になります。

をお使いの場合には、解決する必要があります実行するコマンドのリストを受け付けコンポーネント:

代わりに、IOC-提供されるコンポーネントにコマンドを実行サービス・レイヤ・コンポーネントを作ります各コマンドの適切なハンドラを作成し、それにコマンドオブジェクトをディスパッチします。

ウィンザーでこれを行う方法については、http://devlicious.com/blogs/krzysztof_kozmic/archive/2010/03/11/advanced-castle-windsor-generic-typed-factories-auto-release-and-more.aspx - あなたの選択したIoCコンテナをサポートするコミュニティがその設定を手伝うことができます。

1

マークで述べたように、のStructureMapはあなたが設定し、インターフェイスの名前付きインスタンスを呼び出すことができるようになります:

ObjectFactory.Initialize(x => 
{ 
    x.For<ISomeInterface>().Add<SomeImplementation>().Named("SomeName"); 
} 

あなたはまだ、もちろん、その特定のインターフェイスのためのデフォルトのインスタンスを追加することができます。

ObjectFactory.Initialize(x => 
{ 
    x.For<ISomeInterface>().Add<DefaultImplementation>();  
    x.For<ISomeInterface>().Add<SomeImplementation>().Named("SomeName"); 
} 

ObjectFactory.GetInstance<ISomeInterface>();を呼び出すと、デフォルトインスタンス(Addの代わりにUseで初期化されたインスタンス)が返されます。

ObjectFactory.Initialize(x => 
{ 
    // names are arbitrary 
    x.For<ICommand>().Add<AddAddress>().Named("AddAddress"); 
    x.For<ICommand>().Add<RemoveContact>().Named("RemoveContact"); 
} 

マークで指摘したように、これらが呼び出されます::このことができます

ObjectFactory.GetNamedInstance<ICommand>("AddAddress"); 
ObjectFactory.GetNamedInstance<ICommand>("RemoveContact"); 

希望

は、だからあなたの場合は、セットアップは、次のようになります。

関連する問題