2012-11-23 106 views
1

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

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

有没有办法如何在基于用户设置的运行时chnage实例?什么是最好的方式来做到这一点?也许现在有更好的IoC来做到这一点吗?

回答

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"); 

看看系列视频o PRISM。 second video是Unity的介绍。

+0

请给出一个线索,小例子。如果我理解你的建议,我会更多地了解它 – Vlad

+0

我在上面的答案中添加了示例。 – Tomas00