ssannandeji/Zenject-2019

WhenInjected Into lead to crash under specific circumstances

FriedrichWessel opened this issue · 0 comments

Hello,

I have a special case : I would like to have a class fully Injected when injected into a service, but just the interfaces in the rest of the world. Basicly like this:

var secretInstance = Container.Instantiate<PrivateModel>(); Container.BindInterfacesTo<PrivateModel>().FromInstance(secretInstance); Container.Bind<PrivateModel>().FromInstance(secretInstance).WhenInjectedInto<SecretService>();

But I would like to get rid of the instance creation inside the ctor.

So I tried:
Container.BindInterfacesTo().AsSingle();
Container.Bind().FromResolve().WhenInjectedInto();

But the second line causes a unity editor crash.

Beside that the crash should not happen - any suggestion how to achieve that ?

Thanks for your help !

Full testcode for reference:

using UnityEngine;
using Zenject;

public class FromResolveInstaller : MonoInstaller
{
	public override void InstallBindings()
	{
		Container.Bind<IInitializable>().To<World>().AsSingle();

		var secretInstance = Container.Instantiate<PrivateModel>();
		Container.BindInterfacesTo<PrivateModel>().FromInstance(secretInstance);
		Container.Bind<PrivateModel>().FromInstance(secretInstance).WhenInjectedInto<SecretService>();
		// this line crashes unity
		//Container.Bind<PrivateModel>().FromResolve().WhenInjectedInto<SecretService>();
		// This cannot resolve the interface afterwards 
		//Container.Bind<PrivateModel>().AsSingle().WhenInjectedInto<SecretService>();
		//Container.Bind<PublicInterfaceToModel>().To<PrivateModel>().FromResolve();
		

		Container.Bind<SecretService>().AsSingle();
		Container.Bind<SomeDude>().AsSingle();
		Container.Bind<SneakyDude>().AsSingle();
	}
}

public interface PublicInterfaceToModel
{
	void Open();
}

public class World : IInitializable
{
	
	public World(SecretService secretService, SomeDude dude, SneakyDude sneakyDude)
	{
	}

	public void Initialize()
	{
	}
}

public class PrivateModel : PublicInterfaceToModel
{
	public void Secret()
	{
		Debug.Log("Do Secret stuff");
	}

	public void Open()
	{
		Debug.Log("Do Private stuff");
	}
}


public class SecretService
{
	public SecretService(PrivateModel model)
	{
		model.Secret();
	}
}

public class SneakyDude
{
	// This should throw an Inject error
	/*public SneakyDude(PrivateModel nope)
	{
		nope.Secret();
	}*/
}

public class SomeDude
{
	public SomeDude(PublicInterfaceToModel model)
	{
		model.Open();
	}
}