首页 新闻 会员 周边

MVC的Action Filter中如何注入Service?

0
悬赏园豆:30 [已解决问题] 解决于 2011-05-19 12:46
public class UrlAuthorizeAttribute : AuthorizeAttribute
{
private readonly IUserService userService;

public UrlAuthorizeAttribute(IUserService userService)
{
this.userService = userService;
}
}

我想通过构造器注入service,采用的是Unity IoC。在网上看到一篇文章说是可以通过全局配置文件为指定的Controller配置过滤器,但不知道该怎么实现.

我参考的文章地址:

http://weblogs.asp.net/rashid/archive/2010/05/27/mvcextensions-actionfilter.aspx

Sunny Peng的主页 Sunny Peng | 初学一级 | 园豆:30
提问于:2011-05-19 09:32
< >
分享
最佳答案
0
UrlAuthorizeAttribute 如果是运用到源码上,在编译时就进行了序列化,在使用时再反序列化。
如果需要注入的话,得在运行时构造Attribute。

其实你最终需要的是Filter而不是Attribute。抓住这个本质,只要在需要Filter的时候初始化就行了。

我的做法是
1、首先建立一个Controller与Filter的关系表
2、
从找到Action到执行InvokeAuthorizationFilters之前,将IAuthorizationFilter准备好就行了。
具体做法是实现一个IActionInvoker类,在其GetFilters方法中从关系表中提取出来再构造Filter。

这里是我的实现:
ASP.Net MVC探索之路 - 不想在多个Action上写同样的FitlerAttribute
http://www.cnblogs.com/alby/archive/2010/12/08/1900555.html
http://www.cnblogs.com/alby/archive/2010/12/15/1906485.html

 

收获园豆:30
alby | 菜鸟二级 |园豆:323 | 2011-05-19 10:05
我刚看来:
http://weblogs.asp.net/rashid/archive/2010/05/27/mvcextensions-actionfilter.aspx

他的思路和我差不多,可以参考我做的。我那个做的更彻底一些。
alby | 园豆:323 (菜鸟二级) | 2011-05-19 10:10
你提供的地址中,他的这种延迟构造Filter的委托Fun完全可以只用Fun
然后:
registry.Register( attribute => {attribute.AllowedRole = Role.Administrator; });
就可以这样用:
registry.Register( () => {attribute.AllowedRole = Role.Administrator; });

在我的实现中,也是支持这种延迟构造Filter的
alby | 园豆:323 (菜鸟二级) | 2011-05-19 10:26
非常感谢你的回答。我目前这个项目的架构和Oxite差不多,但是我这边跑不起来,对MVC我也只是一知半解。我正参考你的第二篇文章里面的示例。
Sunny Peng | 园豆:30 (初学一级) | 2011-05-19 10:27
xoohoo.codeplex.com
基于oxite架构的,你有兴趣可以看看。刚我给你说的已经在里面实现了。
alby | 园豆:323 (菜鸟二级) | 2011-05-19 10:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册