我在WebAPI项目中使用StructureMap
作为我的IoC容器。我想根据请求中的值(查询字符串或http标头)提供某些依赖项的不同实现。
StructureMap具有Profiles的概念,这绝对是完美的,我可以覆盖这样的依赖:
For<ISomeDependency>().Use<StandardImplementation>();
Profile("AlternateProfile", pr =>
{
pr.For<ISomeDependency>().Use<AlternateImplementation>();
});
但是,我无法弄清楚我可以在WebAPI生命周期中使用此配置文件的位置。似乎应该在IDependencyResolver.BeginScope()
中允许我这样做:
public IDependencyScope BeginScope()
{
var request = ??!?
if (/* Check an HTTP Header for the request or something here? */)
child = _container.GetNestedContainer("AlternateProfile");
else
child = _container.GetNestedContainer();
return new WebApiStructureMapDependencyResolver(child);
}
WebAPI中的DI设置确实看起来很糟糕,但我希望我只是错过了一些愚蠢的东西。
注意:我使用的是自托管的WebAPI,因此无法使用以下解决方法:https://stackoverflow.com/a/19776966