1

我们目前使用 StructureMap 作为 IoC 容器。一切正常,但现在我们需要在运行时更改默认值。

我们需要的是基于用户提供IEntityRepository、IEntityService的能力。拥有 EntityRepositoryEur、EntityRepositoryRus...

有没有办法根据用户设置在运行时更改实例?最好的方法是什么?也许现在有更好的 IoC 来做到这一点?

4

1 回答 1

1

我不熟悉 StructureMap 但使用 Unity 应用程序块(通常称为 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 上的系列视频。第二个视频是 Unity 简介。

于 2012-11-23T21:06:22.847 回答