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)

相關文章
相關標籤/搜索