2009-08-18 96 views
6

我是Windsor城堡,它对传递正在使用的存储库的控制器构造函数非常有用。如何将存储库传递给ASP.NET MVC中的authorize属性

private IStoryRepository Repository; 
public StoryController(IStoryRepository Repository) 
{ 
    this.Repository = Repository;     
} 

现在我有一个操作是在管理区域显示主管理菜单。我已经使用了自定义的授权属性,这将只是检查登录的用户是管理员(只是在用户表中的isAdmin标志)

[AdminAuthorize] 
public ActionResult Menu() 

private IStoryRepository Repository; 
/// <summary> 
/// Initializes a new instance of the <see cref="AdminAuthorizeAttribute"/> class. 
/// </summary> 
public AdminAuthorizeAttribute(IStoryRepository Repository) 
{ 
    this.Repository = Repository; 
} 

/// <summary> 
/// Checks if the user is authorised 
/// </summary> 
/// <param name="httpContext">The HTTP context.</param> 
/// <returns> 
/// <c>true</c> if authorized; otherwise, <c>false</c>. 
/// </returns> 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    return this.Repository.UserIsAdmin(httpContext.User.Identity.Name); 
} 

我怎样才能城堡到存储库传递到属性构造喜欢它为控制器构造函数做?

回答

1

你基本上有两种选择。将过滤器包装在代理中,可以找到一个很好的例子here

或者,在您的自定义过滤器中,您可以执行显式容器调用。例如使用StructureMap(我有没有广泛使用的城堡)

ObjectFactory.GetInstance(IStoryRepository) 

有可能是延长ActionInvoker做注射第三种方式,但我不知道如何做到这一点来完成。

0

我可能会看看FluentMVC项目。它允许你在启动时配置属性,并且因为它使用引擎盖下的windsor,所以应该允许它轻松地注入pritty。例如

FluentMvcConfiguration.Configure = x => { 
           x.UsingControllerFactory(new WindsorControllerFactory());                x.WithFilter<HandleErrorAttribute>(); 
           x.WithFilter<AuthorizeAttribute>(
            Except 
             .For<AccountController>(ac => ac.LogOn()) 
             .AndFor<AccountController>(ac => ac.LogOn(null, null, false, null)) 
             .AndFor<HomeController>()); 
          }; 

上面的代码将AuthorizeAttribute添加到除登录的所有行动和家庭控制器

不知道什么项目的当前状态,但已经使用了几次,效果很好为了我。

0

问题是,属性是通过反射而不是通过可以被拦截的调用来构造的,并且被调用到容器的调用所取代。

有很多方法可以用来创建可以支持DI的过滤器,最简单的IMHO是扩展动作调用者并覆盖GetFilters,提供一个实现,该实现使用该属性来确定过滤器类型,然后解析该类型从容器中。这种方法的实现可以在MvcTurbine(http://mvcturbine.codeplex.com/sourcecontrol/changeset/view/37298?projectName=mvcturbine#758440)中看到。

0

为什么不从Filter构造函数中的静态工厂方法获取IRepository对象?您只是使用工厂方法来允许DI完成工作。

DI将在您的“网关”方法上工作,而不是标准的“构造器参数”方法。

相关问题