打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了。但是只是MVC中Controller实现了依赖注入。而在Filter中如何实现依赖的注入? 下面我们以Filter中如何实现ILogger(一个记录日志的接口)为例子,看看如何实现依赖ILogger的注入的。

1. 非Global Filter中的注入

首先Filter的注入不同于Controller, Controller的注入是通过构造函数注入的,而Filter是通过属性注入的。如下面的代码,我们的CustomActionFilter中有对于ILogger的依赖,我们就定义一个ILogger的属性。这个属性的赋值将由Autofac完成。

public class CustomActionFilter : ActionFilterAttribute{      public ILogger Logger { get; set; }      public override void OnActionExecuting(ActionExecutingContext filterContext)     {               Logger.Log("OnActionExecuting");      }}

然后定义在Global.asax中添加如下的代码:

主要代码功能是注册依赖ILogger, 然后就是要调用RegisterFilterProvider()方法,调用该方法后,Filter中的属性才会使用Autofac注入。

ContainerBuilder builder = new ContainerBuilder();builder.RegisterControllers(Assembly.GetExecutingAssembly());builder.RegisterType<Logger>().As<ILogger >();builder.RegisterFilterProvider();IContainer container = builder.Build();DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

2. Global Filter中的注入

Autofac提供的RegisterFilterProvider()方法,只适合非Global Filter. 对于Global Filter不适用。原因是因为,Global Filter在程序启动的时候,就已经实例化了,并且只有一个实例。普通的Filter是在有请求的时候,才会实例化。
所以,这里介绍另外一种方式应对Global filter的注入。首先,将所有的依赖放到Filter的够着函数中。First create your attribute with a constructor with all dependencies

public class CustomFilterAttribute : ActionFilterAttribute{    private ILogger _logger;    public CustomFilterAttribute(ILogger logger)    {        _logger= logger;    }    .... }

然后,同样是在Global.asax中初始化Autofac.

var builder = new ContainerBuilder();builder.RegisterControllers(Assembly.GetExecutingAssembly());builder.RegisterType<Logger>().As<ILogger >();builder.RegisterType<CustomFilterAttribute>().SingleInstance();//注意,这里要把我们的全局Filter注册到Autofac中builder.RegisterFilterProvider();IContainer container = builder.Build();DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

修改注册Global Filter的方法:

public static void RegisterGlobalFilters(GlobalFilterCollection filters){    filters.Add(new HandleErrorAttribute());    filters.Add(DependencyResolver.Current.GetService<CustomFilterAttribute>());//注意到了吗? 这里使用了Autofac容易来实例化Filter对象,然后注册到Global Filter中}

一定要确保在你的global.asax中, 先做Autofac的初始化然后再注册global filters.

其它相关文章

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc

IoC容器Autofac(2) - 一个简单示例(附demo源码)

IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)

分析Autofac如何实现Controller的Ioc(Inversion of Control)


本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名justrun(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言

分类: Asp.Net, MVC
标签: MVC, Autofac
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Autofac入门
通过配置的方式使用Autofac
依赖注入框架Autofac(IOC)的简单使用
MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
InfoQ: Microsoft Unity Dependency Injection A...
依赖注入容器Unity Application Block快速入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服