2012-11-23 76 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