尝试使用Structuremap将依赖项注入全局过滤器的问题

时间:2012-06-01 20:17:27

标签: asp.net asp.net-mvc-3 inversion-of-control structuremap

所以我简要地谈了here我是如何运行GlobalFilters.Filters.Add(new MyFilter)的全局过滤器并获得一个子域管理器,它将根据子域信息进行一些数据库查找。

我的目标是在我执行的验证失败时将filtercontext.result设置为新的ResultRedirect对象。但是,如果成功,则此子域管理器对象将在结构图容器中保留,以用于请求的其余部分。

最初我曾相信在全局过滤器运行时没有实例化控制器对象,所以我原本希望根据这个子域管理器的结果填充控制器上的子域对象属性。

但是,我有两个代码:

  1. 我相信当全局过滤器符文时控制器已被实例化,所以即使运行子域管理器并验证请求的全局控制器已经过验证,我也无法在我的控制器上填充子域对象来自容器中的子域管理器对象

  2. 其次,在更大程度上,我似乎找不到使用structuremap将依赖关系注入我的全局过滤器(SomeValidationAttribute:ActionAttribute)的有效方法。

  3. 任何建议

2 个答案:

答案 0 :(得分:0)

1)在控制器的构造中坚持一个简单的依赖,并可能将它注入BeginExecute。但我认为你必须描述你真正试图存档的内容,而不是让我们一起猜测你的解决方案。

2)注册您的GlobalFilterProvider

public class StructureMapGlobalFilterProvider : IFilterProvider
{
    public StructureMapGlobalFilterProvider(IContainer container)
    {
        _container = container;
    }

    private IContainer _container;

    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor 

actionDescriptor)
    {
        return new List<Filter>();
    }
}

来源:http://thecodinghumanist.com/blog/archives/2011/2/3/structuremap-global-action-filters-and-dependency-injection-in-asp-net-mvc-3

答案 1 :(得分:0)

GetFilters的{​​p> FilterAttributeFilterProvider为全局过滤器返回零项。在这种特殊情况下,使用StructureMap的容器定义全局过滤器:

GlobalFilters.Filters.Add(container.GetInstance<LogAttribute>());

然后你需要将StructureMap&{39} IContainer注入你的过滤器:

public class LogAttribute : ActionFilterAttribute
{
    private readonly IContainer _container; 
    public LogAttribute(IContainer container)
    {
        _container = container;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        _container.GetInstance<ILogActionService>().Log("......data......");
        base.OnActionExecuted(filterContext);
    }
}

在不调用_container.GetInstance的情况下,全局过滤器的所有依赖项将仅在程序开始时实例化一次。