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 の紹介です。