Skip to content

容器事件

一个实例的创建,首先是创建一个实例对象,然后对这个实例对象的属性、变量、方法进行依赖注入,最后对此实例进行动态代理
容器有一些事件,可以允许用户在容器不同阶段执行一些自己的逻辑,或修改注入的内容。 这些事件包括:

  1. OnBeforeCreateInstance 创建实例前
  2. OnAfterCreateInstance 创建实例后
  3. OnBeforeInject 依赖注入前
  4. OnAfterInject 依赖注入后
  5. OnBeforeProxy 创建代理前
  6. OnAfterProxy 创建代理后
C#
[Include]
public class Program
{

    /// <summary>
    /// 默认注入最高版本
    /// </summary>
    [AutoAssemble]
    private static UserController controller;

    static void Main(string[] args)
    {
        AsDIContext.Container.OnBeforeCreateInstance += Container_OnBeforeCreateInstance;
        AsDIContext.Container.OnAfterCreateInstance += Container_OnAfterCreateInstance;
        AsDIContext.Container.OnBeforeInject += Container_OnBeforeInject;
        AsDIContext.Container.OnAfterInject += Container_OnAfterInject;
        AsDIContext.Container.OnBeforeProxy += Container_OnBeforeProxy;
        AsDIContext.Container.OnAfterProxy += Container_OnAfterProxy;

        AsDIContext.Start();
        controller.Print();

    }

    private static object Container_OnBeforeCreateInstance(TypeObject arg)
    {
        Console.WriteLine("开始创建实例,类型为【" + arg.BaseType.Name + "】");
        return null;
    }
    private static object Container_OnAfterCreateInstance(TypeObject arg, object arg2)
    {
        Console.WriteLine("完成创建实例,类型为【" + arg.BaseType.Name + "】,实例类型为:" + arg2?.GetType().Name);
        return null;
    }

    private static void Container_OnBeforeInject(TypeObject arg1, object arg2)
    {
        Console.WriteLine("开始依赖注入,类型为【" + arg1.BaseType.Name + "】");
    }
    private static void Container_OnAfterInject(TypeObject arg1, object arg2)
    {
        Console.WriteLine("结束依赖注入,类型为【" + arg1.BaseType.Name + "】");
    }

    private static void Container_OnBeforeProxy(TypeObject arg1, object arg2)
    {
        Console.WriteLine("开始动态代理,类型为【" + arg1.BaseType.Name + "】");
    }

    private static void Container_OnAfterProxy(TypeObject arg1, object arg2)
    {
        Console.WriteLine("结束动态代理,类型为【" + arg1.BaseType.Name + "】");
    }

}

[Service]
public class UserController
{
    [AutoAssemble]
    private IUserService user;

    public void Print()
    {
        Console.WriteLine("Hello " +user.GetUserName());
    }
}

public interface IUserService
{
    string GetUserName();
}

[Service(1)]
public class UserService1 : IUserService
{
    public string GetUserName() => "Jack";
}

[Service(2)]
public class UserService2 : IUserService
{
    public string GetUserName() => "Lily";

}

以上代码执行后,输出:

sh
> 开始创建实例,类型为【UserController】
> 开始依赖注入,类型为【UserController】
> 开始创建实例,类型为【IUserService】
> 开始创建实例,类型为【UserService2】
> 开始依赖注入,类型为【UserService2】
> 结束依赖注入,类型为【UserService2】
> 完成创建实例,类型为【UserService2】,实例类型为:UserService2
> 开始依赖注入,类型为【IUserService】
> 结束依赖注入,类型为【IUserService】
> 开始动态代理,类型为【IUserService】
> 结束动态代理,类型为【IUserService】
> 完成创建实例,类型为【IUserService】,实例类型为:UserService2
> 结束依赖注入,类型为【UserController】
> 完成创建实例,类型为【UserController】,实例类型为:UserController
> Lily

注意

  1. 这些事件对所有容器管理的类都有效,一旦需要特殊处理,请务必对类型就行判断,防止影响其它类型
  2. BeforeCreateInstance 可以返回一个实例,一旦返回实例,则无论定义了什么实例化方式,一律不再执行,以此返回的实例为准。不过只是不再实例化,依赖注入和动态代理依然会执行
  3. AfterCreateInstance 也可以返回一个实例,即可判断和修改容器实例化的对象,比如容器实例化后是null,则可以自己实例化或从其它方式获取
  4. BeforeProxyAfterProxy 仅对接口和抽象类有效,其它类型由于无法代理,将不会触发这两个事件

沪ICP备2025119739号