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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM