Init(args) Lite is a free version of the Init(args) dependency injection framework. It extends the MonoBehaviour class with the ability to receive arguments during initialization.
You'll be able to continue using all the same commands you're used to - AddComponent and Instantiate - just with the added ability to pass arguments as well.
This small but significant change means that your components are no longer closed islands. Things that used to be pretty much impossible to do, like writing unit tests for them, are suddenly easy and frictionless.
The arguments will be received by components before the Awake and OnEnable events, so you don't have to avoid using them, or clutter them with null-checking.
Init(args) Lite works using pure dependency injection, without any reflection; generic methods and interfaces are used to provide strongly typed pipelines through which dependencies can be delivered.
This approach has various benefits, such as solid performance compared to reflection-based dependency injection solutions, and errors being caught as early as possible at compile-time.
Instantiate
with upto twelve arguments.AddComponent
with upto twelve arguments.x != Null
- easily test if an interface type variable contains a null or destroyed reference.
public class TextDisplayer : MonoBehaviour<StringEvent, Text>
{
[SerializeField] StringEvent stringEvent;
[SerializeField] Text text;
protected override void Init(StringEvent stringEvent, Text text) // <- dependencies received here
{
this.stringEvent = stringEvent;
this.text = text;
}
void OnEnable() => stringEvent.AddListener(OnEventRaised);
void OnDisable() => stringEvent.RemoveListener(OnEventRaised);
void OnEventRaised(string value) => text.text = value;
}
[SetUp]
public void Setup()
{
stringEvent = new StringEvent();
var gameObject = new GameObject();
text = gameObject.AddComponent<Text>();
gameObject.AddComponent(out textDisplayer, stringEvent, text); // <- dependencies injected here
}
[Test]
public void RaisingStringEventUpdatesDisplayedText()
{
stringEvent.Raise("Test");
Assert.AreEqual("Test", text.text);
}