本日は VContainer の小ネタ枠です。
VContainer でクラスを登録する際に特定のパラメータを指定してクラスを登録する方法を記事に残します。
WithParameter
登録時にWithParameterを使用することで型が一意でないパラメータを挿入できます。
vcontainer.hadashikick.jp
builder.Register<SomeService>(Lifetime.Singleton) .WithParameter<string>("http://example.com");
または
builder.Register<SomeService>(Lifetime.Singleton) .WithParameter("url", "http://example.com");
サンプルスクリプト
以下の前回記事のスクリプトを一部修正して動作を確認してみます。
bluebirdofoz.hatenablog.com
HelloWorldServiceにstringのパラメータを追加し、出力メッセージを指定できるようにしました。
・HelloWorldService.cs
namespace MyGame { public class HelloWorldService { private readonly string _helloMessage; // コンストラクタのパラメータで出力メッセージを設定する必要がある public HelloWorldService(string helloMessage) { this._helloMessage = helloMessage; } public void Hello() { UnityEngine.Debug.Log(_helloMessage); } } }
このとき、GameLifetimeScopeを以下の通り変更してHelloWorldService生成時に挿入されるパラメータを指定できます。
・GameLifetimeScope.cs
using UnityEngine; using VContainer; using VContainer.Unity; namespace MyGame { public class GameLifetimeScope : LifetimeScope { [SerializeField] private HelloScreen helloScreen; protected override void Configure(IContainerBuilder builder) { // HelloWorldServiceをDIコンテナに登録する // WithParameterでコンストラクタの引数を指定する builder.Register<HelloWorldService>(Lifetime.Singleton).WithParameter("helloMessage", "Hi!");; // GamePresenterをVContainerのEntryPointに登録する builder.RegisterEntryPoint<GamePresenter>(); // HelloScreenコンポーネントをDIコンテナに登録する builder.RegisterComponent<HelloScreen>(helloScreen); } } }
実際にシーンを再生して動作を確認します。
ボタンを押下すると指定したメッセージが挿入されていることが確認できます。
また前述の通り、以下の記法でも同じようにパラメータを挿入できます。
builder.Register<HelloWorldService>(Lifetime.Singleton).WithParameter<string>("Hi!");;