2

我正在尝试使用 StructureMap 遵循本教程:http: //iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Action-Filters.aspx

我想弄清楚的是这一行的 StructureMap 等价物:

var container = (ICanResolveDependencies) HttpContext.Current.ApplicationInstance;

我想取回容器,所以我可以手动解决那里的依赖关系。

这就是我在 global.asax 中设置依赖解析器的方式

            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
            new StructureMapDependencyResolver(container));
4

1 回答 1

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,但根据这篇博文,你可以这样设置:

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

于 2012-06-22T21:51:50.290 回答