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(附源碼)