• IoC容器Autofac(5)


    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)

  • 相关阅读:
    Git报错:remote: HTTP Basic: Access denied的解决方法
    扩展模块之ConfigParser模块
    pyftplib
    kafka
    Android MarqueeTextView : 轻松实现文本滚动(跑马灯)效果
    nx
    ScorpionX-RX-64
    SDWebImage源码解读
    iOS 性能优化及AFNetworking源码解析
    vue使用g6做流程图
  • 原文地址:https://www.cnblogs.com/JustRun1983/p/3793875.html
Copyright © 2020-2023  润新知