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的注入的。html

1. 非Global Filter中的注入

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

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

而后定义在Global.asax中添加以下的代码:函数

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

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 dependenciesspa

public class CustomFilterAttribute : ActionFilterAttribute
{
    private ILogger _logger;

    public CustomFilterAttribute(ILogger logger)
    {
        _logger= logger;
    }
    ....
 }

而后,一样是在Global.asax中初始化Autofac..net

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.code

其它相关文章htm

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)

相关文章
相关标签/搜索