1

因此,我在这里简要介绍了我如何拥有一个全局过滤器,该过滤器运行GlobalFilters.Filters.Add(new MyFilter)并获得一个子域管理器,该管理器将根据子域信息进行一些数据库查找。

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

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

但是,我有两个困境:

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

  2. 其次,更重要的是,我似乎找不到使用结构映射将依赖项注入全局过滤器(SomeValidationAttribute:ActionAttribute)的有效方法。

有什么建议么

4

2 回答 2

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

于 2013-04-23T16:54:59.083 回答
0

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

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

然后您还需要将 StructureMap 注入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,全局过滤器的所有依赖项将仅在程序开始时实例化一次。

于 2015-09-05T10:36:05.093 回答