我正在尝试使用StructureMap来学习本教程:http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Action-Filters.aspx
我想弄清楚的是这一行的StructureMap等价物:
var container = (ICanResolveDependencies) HttpContext.Current.ApplicationInstance;
我想恢复容器,所以我可以手动解决依赖关系。
这就是我在global.asax
中设置dependencyresolver的方法 GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
new StructureMapDependencyResolver(container));
答案 0 :(得分:3)
您可以在动作过滤器的构造函数中仅需要IContainer
依赖项。如果StructureMap
没有自动注册,您可以注册:
For<IContainer>().Use<Container>();
修改强>
选项1:您不能只使用以下内容:
GlobalConfiguration.Configuration.ServiceResolver.GetService(...)
// or (not sure what would be the right syntax)
GlobalConfiguration.Configuration.ServiceResolver.Current.GetService(...)
设置后必须有一些检索当前服务解析器的方法。
选项2:使用常规MVC,您可以获得当前的解析器:
DependencyResolver.Current
并像这样使用它:
DependencyResolver.Current.GetService()
看起来WebAPI不使用DependencyResolver,但根据this blog post,您可以这样设置:
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
// this override is needed because WebAPI is not using DependencyResolver to build controllers
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
DependencyResolver.Current.GetService,
DependencyResolver.Current.GetServices);
现在尝试使用动作过滤器中的DependencyResolver.Current
。
选项3:直接使用ObjectFactory.GetInstance
- 可能不是MVC项目中最好的主意,因为它应该已经封装在IDependencyResolver实例中。