1

現在、IoC コンテナーとして StructureMap を使用しています。すべて正常に機能していましたが、実行時にデフォルトを変更する必要があります。

必要なのは、ユーザーに基づいて IEntityRepository、IEntityService を提供する機能です。EntityRepositoryEur、EntityRepositoryRus...

ユーザー設定に基づいて実行時にインスタンスを変更する方法はありますか? それを行う最善の方法は何ですか?たぶん、それを行うためのより良いIOCが今ありますか?

4

1 に答える 1

1

StructureMap には詳しくありませんが、Unity Application Block (通常は単に Unity と呼ばれます) を使用すると、単一のインターフェイスでより具体的なタイプ (サービス) を登録できます。これらのサービスに名前を割り当て、解決時に登録済みサービスのリストを受け取ります。次に、ユーザー設定に基づいていずれかを選択できます。

これは、構成ファイルを使用して名前付きサービスを登録する方法の例です

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <containers>
      <container>
        <types>
          <type name="OutputService1" type="InterfacesLibrary.IOutputService, InterfacesLibrary" mapTo="InputOutputLibrary.ConsoleOutputService, InputOutputLibrary" />
          <type name="OutputService2" type="InterfacesLibrary.IOutputService, InterfacesLibrary" mapTo="InputOutputLibrary.MsgBoxOutputService, InputOutputLibrary" />
        </types>
      </container>
   </containers>
  </unity>
</configuration>

または、コードから同じことを行うことができます

container.RegisterType<IOutputService, ConsoleOutputService>("OutputService1");
container.RegisterType<IOutputService, MsgBoxOutputService>("OutputService2");

解決時に、ユーザーの要件に基づいていずれかのタイプを解決します。

    IOutputService outputService;
    if (user.LikesConsole == true)
      outputService = container.Resolve<IOutputService>("OutputService1");
    else
      outputService = container.Resolve<IOutputService>("OutputService2");

PRISM に関する一連のビデオをご覧ください。2つ目のビデオは Unity の紹介です。

于 2012-11-23T21:06:22.847 に答える