• Autofac


    Autofac在提供之前那些方法的时候, 同时提供了五个事件, 这一篇就看一下这几个事件.

    一、五大事件

    builder.RegisterType<Person>().As<IPerson>()
        .OnRegistered(r => Console.WriteLine("OnRegistered"))
        .OnPreparing(r => Console.WriteLine("OnPreparing"))
        .OnActivating(r => Console.WriteLine("OnActivating"))
        .OnActivated(r => Console.WriteLine("OnActivated"))
        .OnRelease(r => Console.WriteLine("OnRelease"));
    
    Console.WriteLine("---------------");
    var container = builder.Build();
    Console.WriteLine("----------------------");
    var person = container.Resolve<IPerson>();
    Console.WriteLine("--------------------------------");
    person.Self();

    看一下结果:

    额, 首先我得说明一下, 输出的顺序和我写事件的顺序是没有关系的, 不是说, 我事件写在前面, 输出就在前面. 从这张图上, 能看到, 对象创建时, 构造函数的调用时在中间的.

    其实, 按照通常理解, 我觉得, 构造函数的调用应该是在 OnActivating 事件之后的. 但是这里跑到前面去了, 也不知道是不是我的dll有问题啊

    既然有这个疑问, 但是又找不到答案, 那就只好自己去看源码了.

    先看看OnActivating做了什么

    这个方法, 就是注册事件, 将handler注册到RegistrationData的ActivatingHandlers的集合中.

    在Excute(上一篇贴过)方法里面, 有一个Activate方法. 方法如下:

    这个方法里面, 已经可以看到几个事件的执行顺序了, 更加具体的源码, 我就不贴了, 代码有点多, 有兴趣的童鞋可以自己去瞧一下

    这里有一点值的注意, 我这里用的是无参的构造函数, 如果是有参的构造函数, 而参数是IAnimal和IGo呢, 那么IAnimal和IGo的OnActivating方法, 就会在IPerson的构造函数之前执行. 

    builder.RegisterType<Dog>().As<IAnimal>()
        .OnActivating(r => Console.WriteLine("IAnimal - OnActivating"))
        .OnActivated(r => Console.WriteLine("IAnimal - OnActivated"))
        .OnRelease(r => Console.WriteLine("IAnimal - OnRelease"))
        .OnRegistered(r => Console.WriteLine("IAnimal - OnRegistered"))
        .OnPreparing(r => Console.WriteLine("IAnimal - OnPreparing"));
    builder.RegisterType<Go>().As<IGo>()
        .OnActivating(r => Console.WriteLine("IGo + OnActivating"))
        .OnActivated(r => Console.WriteLine("IGo + OnActivated"))
        .OnRelease(r => Console.WriteLine("IGo + OnRelease"))
        .OnRegistered(r => Console.WriteLine("IGo + OnRegistered"))
        .OnPreparing(r => Console.WriteLine("IGo + OnPreparing"));
    builder.RegisterType<Person>().As<IPerson>()
        .OnActivating(r => Console.WriteLine("IPerson | OnActivating"))
        .OnActivated(r => Console.WriteLine("IPerson | OnActivated"))
        .OnRelease(r => Console.WriteLine("IPerson | OnRelease"))
        .OnRegistered(r => Console.WriteLine("IPerson | OnRegistered"))
        .OnPreparing(r => Console.WriteLine("IPerson | OnPreparing"));
    
    Console.WriteLine("---------------");
    var container = builder.Build();
    Console.WriteLine("----------------------");
    var person = container.Resolve<IPerson>();
    Console.WriteLine("--------------------------------");
    person.Self();

    现在来看, 整个执行顺序就很明显了

    参考:

    Autofac 组件、服务、自动装配 《第二篇》

    Autofac文档

  • 相关阅读:
    哈希算法原理和一致性哈希算法
    负载均衡之轮循算法
    Mybatis的使用
    Spring与SpringMVC的整合
    编程式事务与声明式事务
    八大排序方法及对Arrays类的排序实现探讨
    单例模式的线程安全性
    HotSpot对象的创建及内存布局
    逃逸分析、栈上分配、标量替换、同步替换
    java编译器和解释器
  • 原文地址:https://www.cnblogs.com/elvinle/p/6183743.html
Copyright © 2020-2023  润新知