我们目前正在使用StructureMap作为IoC容器。一切正常,但现在我们需要在运行时更改默认值。
我们需要的是能够根据用户提供IEntityRepository,IEntityService。拥有EntityRepositoryEur,EntityRepositoryRus ......
是否有某种方法可以根据用户设置在运行时更新实例?最好的方法是什么?也许现在有更好的IoC可以做到这一点吗?
答案 0 :(得分: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的系列视频。 second video是Unity的介绍。