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同士じゃないとイベントが受け取れないことがわかりました

f:id:toshizabeth:20210626195843p:plain


DIContainerでスコープが別れているのは直感的にわかりやすい!


次は、DIContainerが異なる場合でも全体にイベントを投げる場合はどうするか。

ということを調べて書いていく