摘要
MemoryPool、Factory、SignalBus是Zenject高级编程必须掌握的3大模块,
分别负责内存优化、创建对象、内部通信;单模块的内容也非常的丰富,都是独立了文档来单独作介绍;
这些也是Zenject魅力所在。
为什么要使用通信来编程
指定两个类A和B通信,通常来说,你会选择:
- 从B里面直接调用A的方法,这样B是强制依赖A,违背软件设计开闭原则
- 定义一个回调在A里面,这样B也是强制依赖A,违背软件设计开闭原则
软件设计应该是解耦,A和B类进行通信,他们没有必要知道彼此的情况;这样达到松耦合的目的,使用通信来处理
快速开始示例
public class UserJoinedSignal
{
public string Username;
}
public class GameInitializer : IInitializable
{
readonly SignalBus _signalBus;
public GameInitializer(SignalBus signalBus)
{
_signalBus = signalBus;
}
public void Initialize()
{
_signalBus.Fire(new UserJoinedSignal() {
Username = "Bob" });
}
}
public class Greeter
{
public void SayHello(UserJoinedSignal userJoinedInfo)
{
Debug.Log("Hello " + userJoinedInfo.Username + "!");
}
}
public class GameInstaller : MonoInstaller<GameInstaller>
{
public override void InstallBindings()
{
SignalBusInstaller.Install(Container);
Container.DeclareSignal<UserJoinedSignal>();
Container.Bind<Greeter>().AsSingle();
Container.BindSignal<UserJoinedSignal>()
.ToMethod<Greeter>(x => x.SayHello).FromResolve();
Container.BindInterfacesTo<GameInitializer>().AsSingle();
}
}
另外一种处理方式
public class Greeter : IInitializable, IDisposable
{
readonly SignalBus _signalBus;
public Greeter(SignalBus signalBus)
{
_signalBus = signalBus;
}
public void Initialize()
{
_signalBus.Subscribe<UserJoinedSignal>(OnUserJoined);
}
public void Dispose()
{
_signalBus.Unsubscribe<UserJoinedSignal>(OnUserJoined);
}
void OnUserJoined(UserJoinedSignal args)
{
SayHello(args.Username);
}
public