【问题标题】:StructureMap, different implementation for different userStructureMap,不同用户的不同实现
【发布时间】:2012-11-23 20:12:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# ioc-container structuremap


    【解决方案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 的系列视频。 second video 是 Unity 的介绍。

    【讨论】:

    • 请提供线索,小例子。如果我能理解你的建议,我会进一步了解它
    • 我在上面的答案中添加了示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多