StructureMap依赖关系解析:从ActionFilter手动获取实例

时间:2012-06-22 21:19:31

标签: structuremap asp.net-web-api

我正在尝试使用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));

1 个答案:

答案 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实例中。