初学者,自用笔记
依赖注入(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);
}
}

京公网安备 11010502036488号