【问题标题】:Problems trying to inject dependencies into Global Filter using Structuremap尝试使用 Structuremap 将依赖项注入全局过滤器的问题
【发布时间】:2012-06-01 20:17:26
【问题描述】:

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

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

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

但是,我有两个难题:

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

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

任何建议

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      GetFilters of FilterAttributeFilterProvider 为全局过滤器返回零项。在这种特殊情况下,使用 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,全局过滤器的所有依赖项将仅在程序开始时实例化一次。

      【讨论】:

        猜你喜欢
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        相关资源
        最近更新 更多