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

StructureMap依赖项解析:手动从ActionFilter获取实例,structuremap,asp.net-web-api,Structuremap,Asp.net Web Api,我尝试使用StructureMap来学习本教程: 我想弄明白的是这行的StructureMap等价物: var container = (ICanResolveDependencies) HttpContext.Current.ApplicationInstance; 我想拿回容器,这样我就可以手动解析那里的依赖关系了 这就是我在global.asax中设置dependencyresolver的方式 GlobalConfiguration.Configuration.S

我尝试使用StructureMap来学习本教程:

我想弄明白的是这行的StructureMap等价物:

var container = (ICanResolveDependencies) HttpContext.Current.ApplicationInstance;
我想拿回容器,这样我就可以手动解析那里的依赖关系了

这就是我在global.asax中设置dependencyresolver的方式

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

您可以只需要在操作筛选器的构造函数中使用
IContainer
依赖项。如果它不是由
StructureMap
自动注册的,您可以通过以下方式进行注册:

For<IContainer>().Use<Container>();
一旦设置了当前服务解析器,就必须有某种方法来检索它

选项2:使用常规MVC,您可以获得如下当前解析器:

DependencyResolver.Current
DependencyResolver.Current.GetService()
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
DependencyResolver.Current.GetService()
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);
看起来WebAPI没有使用DependencyResolver,但根据,您可以如下设置:

DependencyResolver.Current
DependencyResolver.Current.GetService()
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);
现在尝试使用动作过滤器中的
dependencysolver.Current


选项3:直接使用
ObjectFactory.GetInstance
——可能不是MVC项目中的最佳方案,因为它应该已经封装在IDependencyResolver实例中。

这个问题与NHibernate无关。你应该去掉那个标签。我不确定这是否重要,但这是MVC4。我所看到的一切都表明,如果我想在过滤器/属性中注入新的内容,我需要变得更加有趣。你能提供一个更详细的例子吗?对不起,我以为你已经在你的动作过滤器中使用构造函数注入了。我已经编辑了答案。看看这些能不能帮上忙,你就是那个人!我选择了选项1。Option2很麻烦,因为有两个相同的解析程序接口。