zoukankan      html  css  js  c++  java
  • 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文档

  • 相关阅读:
    PHP安全编程之php.ini配置
    PHP安全编程
    PHP操作Mongodb
    PHP 提高PHP性能的编码技巧以及性能优化
    HTTP 304 详解
    PHP环境变量归纳(转自网络)
    【转载】解决Apache2+PHP上传文件大小限制的问题
    机器学习六 Xgboost: 一把屠龙刀的自我修养
    机器学习五 EM 算法
    机器学习四 SVM
  • 原文地址:https://www.cnblogs.com/elvinle/p/6183743.html
Copyright © 2011-2022 走看看