【发布时间】:2015-12-17 18:43:36
【问题描述】:
我刚开始使用 Unity IOC,希望有人能提供帮助。我需要能够在运行时切换 Unity 中的依赖项。我有两个容器分别用于生产和开发/测试环境,“prodRepository”和“testRepository”在 web.config 中定义如下:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="TestDataService" type="MyApp.API.Data.TestDataRepository.TestDataService, MyApp.API.Data" />
<alias alias="ProdDataService" type="MyApp.API.Data.ProdDataRepository.ProdDataService, MyApp.API.Data" />
<assembly name="MyApp.API.Data" />
<container name="testRepository">
<register type="MyApp.API.Data.IDataService" mapTo="TestDataService">
<lifetime type="hierarchical" />
</register>
</container>
<container name="prodRepository">
<register type="MyApp.API.Data.IDataService" mapTo="ProdDataService">
<lifetime type="hierarchical" />
</register>
</container>
</unity>
在 WebApiConfig 类中 Unit 配置如下
public static void Register(HttpConfiguration config)
{
config.DependencyResolver = RegisterUnity("prodRepository");
//... api configuration ommitted for illustration
}
public static IDependencyResolver RegisterUnity(string containerName)
{
var container = new UnityContainer();
container.LoadConfiguration(containerName);
return new UnityResolver(container);
}
为了测试,我创建了一个简单的控制器和动作来切换配置:
[HttpGet]
public IHttpActionResult SwitchResolver(string rName)
{
GlobalConfiguration.Configuration
.DependencyResolver = WebApiConfig.RegisterUnity(rName);
return Ok();
}
我从网络浏览器调用它: http://localhost/MyApp/api/Test/SwitchResolver?rName=prodRepository
当我尝试通过 API 从存储库中检索实际数据时,首先它来自“prodRepository”,这是可以理解的,因为这就是它在代码中的初始化方式。从浏览器将其切换到“testRepository”后,数据按预期来自测试存储库。当我将其切换回 prodRepository 时,API 会不断向我发送来自测试存储库的数据。 我在控制器中看到 GlobalConfiguration.Configuration .DependencyResolver 按预期将容器和注册更改为 URL 查询中指定的内容,但它似乎只更改了一次配置,然后保持在该配置。
好的,所以这个邪恶的计划是我想出的,但由于我是新手,所以我可能完全走错了方向。 我需要能够在运行时动态指定要使用的容器,希望无需重新加载 API。上面的代码是否有意义或您有什么建议?
【问题讨论】:
标签: c# dependency-injection inversion-of-control unity-container ioc-container