初学者,自用笔记

依赖注入(DI)-手动DI

组合根

public class Bootstrapper : MonoBehaviour
{
    [SerializeField] private Player player;
    [SerializeField] private GameFramework gameFramework;

    private void Awake()
    {
        // 把具体实现注入给 player
        player.Construct(gameFramework); // gameFramework 实现了 ICoroutineService
    }
}

调用方

public class PlayerController : MonoBehaviour, IUpdateable
{
    private IUpdateLoop _loop;

    public void Construct(IUpdateLoop loop) => _loop = loop;

    private void OnEnable() => _loop.RegisterUpdate(this);
    private void OnDisable() => _loop.UnregisterUpdate(this);

    public void OnUpdate()
    {
        // 原Update 内容
    }
}

依赖注入(DI)-VContainer框架

注册

public class GameLifetimeScope : LifetimeScope
{
    [SerializeField] private MonoController loopHost; // 场景里拖引用
    [SerializeField] PlayerController playerController;

    protected override void Configure(IContainerBuilder builder)
    {
        // 把已有的类注册成服务(同一个实例)
        builder.RegisterComponent(loopHost).As<ICoroutineService>();
       
        // new一个类,注册为单例
        builder.RegisterComponent<MonoConrtroller>(Lifetime.Singleton);
      
        // new一个类,含接口的单例
        builder.RegisterComponent<MonoController>(Lifetime.Singleton).AsSelf().
        AsImplementedInterfaces();

        // 注册一个入口点,非 Mono 的更新/业务类也可以,要继承自IStartable等
        builder.RegisterEntryPoint<PlayerPresenter>(); 
      
        // 注册指定类型的所有实例
        builder.RegisterComponentInHierarchy<PlayerController>();
      
        // 注册mono类,这样才能自动注入
        builder.RegisterComponent(playerController);
    }
}

字段注入

纯C#类与mono类在注入上没太大差异

public class PlayerPresenter : IStartable
{
    [Inject]//表示由vc进行注入,直接进行自动注入
    private  ICoroutineService _coroutines;

  public void Start() //vc框架中的start
  {}

}
   

方法注入

public class PlayerController : MonoBehaviour
{
    private ICoroutineService _coroutines;

    [Inject]
    public void Construct(ICoroutineService coroutines)
    {
        _coroutines = coroutines;
    }

    public void Construct(ICoroutineService coroutines)
    {
        _coroutines = coroutines;
    }
}


创建注入

public class Pool<T> : PoolBase where T : PooledObjectBase
{
    private IObjectResolver _resolver; // vc容器接口

    public void Init(IObjectResolver resolver)
    {
        _resolver = resolver;
    }

    private T createFunc()
    {
      // 使用vc的Instantiate,自动注入,prefab不用注册入口
        return _resolver.Instantiate(prefab, poolParent);
    }
}