代码之家  ›  专栏  ›  技术社区  ›  Mark

如何解决MVC过滤器属性中的依赖注入

  •  13
  • Mark  · 技术社区  · 13 年前

    我正在使用Autofac进行依赖注入。ExtensibleActionInvoker声称能够对操作筛选器执行属性注入。在运行时设置一个属性的属性(这看起来是个坏主意)在一个简单的单元测试中是可行的,但是在一个繁忙的、多线程的web服务器中它肯定会出错,所以这个想法看起来是一个反模式。因此,这个问题:

    如果我的AuthorizationAttribute依赖于其他组件才能正常工作,那么实现这一点的正确[体系结构]模式是什么?

    i、 e.授权属性取决于IUserRepository。。。怎样 应该 这段关系能解决吗?

    4 回复  |  直到 13 年前
        1
  •  17
  •   Tim Cooper    13 年前

    ExtensibleActionInvoker声称能够对操作筛选器执行属性注入。

    正确-但不要将操作筛选器与可能未实现它们的属性混淆。在ASP.NET MVC中实现这一点的最简单方法是划分责任,即使MVC框架允许您将它们组合起来。

    E、 例如,使用一对类-一个只保存数据的属性类:

    // Just a regular old attribute with data values
    class SomeAttribute : Attribute { ... }
    

    // Gets dependencies injected
    class SomeFilter : IActionFilter { ... }
    

    SomeFilter 只是用典型的方法 SomeAttribute 来自控制器或操作方法的属性,通过 GetCustomAttributes() 做任何需要的工作。

    ExtensibleActionInvoker 连接过滤器:

    builder.RegisterControllers(...).InjectActionInvoker();
    builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
    builder.RegisterType<SomeFilter>().As<IActionFilter>();
    

    它可能比使用属性作为过滤器的方法编写的代码多一点,但是从长远来看,代码的质量会更好(例如,避免属性的限制和服务定位器解决方案的笨拙)

        2
  •  2
  •   Mark    13 年前

    我认为实现这一点最简单的方法是咬紧牙关,接受对autofac本身的依赖。虽然对国际奥委会的依赖本身就是一种反模式,但它更容易缓和。可以按如下方式实现属性:

    public class UserAuthorizeAttribute : AuthorizeAttribute
    {            
        public IUserRepository CurrentUserService
        {
            get
            {
                var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
                var cp = cpa.ContainerProvider;
                return cp.RequestLifetime.Resolve<IUserRepository>();
            }
        }
    }
         ...
    
        3
  •  2
  •   David Neale    13 年前

    在MVC2之前没有直接的方法可以做到这一点。这里有一个有趣的技巧: http://www.mattlong.com.au/?p=154 . 我建议使用 Common Service Locator

    如果您使用的是MVC 3,那么您可以使用 MVC Service Location

        4
  •  0
  •   Arnis Lapsa    13 年前

    如果不改变过滤器注册的方式,构造函数注入似乎是不可能的。

    in Asp.Net Mvc3 :

    所以-接下来最好的事情是属性注入(Mvc3提供了一些现成的支持)。

    how to 因为你是手工做的。

    different way . 这是 usage .

    另一件你可能想调查的事是 MvcTurbine 项目。与更通用的MvcExtensions项目相比,MvcTurbine主要用于提供依赖注入支持。