MessagePipeのScopeテスト1
前回の続きでMessagePipeを使っていきます
使用環境
- Unity
- Zenject
- MessagePipe v1.6.1
イベントのスコープ
Zenjectを使用してイベントを投げていく上で、イベントのスコープが気になったので簡単にテスト
public class ScopeTest { public class Publisher { [Inject] private IPublisher<string> _publisher; public void Send(string message) => _publisher.Publish(message); } public class Subscriber { [Inject] private ISubscriber<string> _subscriber; public void Setup(string name) => _subscriber.Subscribe(x => Debug.Log($"{name} {x}")); } private DiContainer _contaier1; private DiContainer _contaier2; [Test] public void Test1() { _contaier1 = new DiContainer(); _contaier2 = new DiContainer(); _contaier1.BindMessageBroker<string>(_contaier1.BindMessagePipe()); _contaier2.BindMessageBroker<string>(_contaier2.BindMessagePipe()); // イベントを受ける方 var service1 = _contaier1.Instantiate<Subscriber>(); service1.Setup("Container1"); var service2 = _contaier2.Instantiate<Subscriber>(); service2.Setup("Container2"); // イベントを投げる方 var publisher1 = _contaier1.Instantiate<Publisher>(); publisher1.Send("Test"); } }
Container1 と Container2 を生成して、それぞれからイベントを受ける用のインスタンスを生成。
// イベントを受ける方 var service1 = _contaier1.Instantiate<Subscriber>(); service1.Setup("Container1"); var service2 = _contaier2.Instantiate<Subscriber>(); service2.Setup("Container2");
そしてイベントを送る用のクラスはContainer1から生成して、送る
// イベントを投げる方 var publisher1 = _contaier1.Instantiate<Publisher>(); publisher1.Send("Test");
結果は "Container1 Test" と表示されたので、同じDIContainer同士じゃないとイベントが受け取れないことがわかりました
DIContainerでスコープが別れているのは直感的にわかりやすい!
次は、DIContainerが異なる場合でも全体にイベントを投げる場合はどうするか。
ということを調べて書いていく