Files
dungeons/Assets/Plugins/Zenject/OptionalExtras/Signals/Internal/Binders/BindSignal/BindSignalFromBinder.cs

68 lines
2.4 KiB
C#

using System;
using ModestTree;
namespace Zenject
{
public class BindSignalFromBinder<TObject, TSignal>
{
readonly BindStatement _bindStatement;
readonly Func<TObject, Action<TSignal>> _methodGetter;
readonly DiContainer _container;
readonly SignalBindingBindInfo _signalBindInfo;
public BindSignalFromBinder(
SignalBindingBindInfo signalBindInfo, BindStatement bindStatement, Func<TObject, Action<TSignal>> methodGetter,
DiContainer container)
{
_signalBindInfo = signalBindInfo;
_bindStatement = bindStatement;
_methodGetter = methodGetter;
_container = container;
}
public SignalCopyBinder FromResolve()
{
return From(x => x.FromResolve().AsCached());
}
public SignalCopyBinder FromResolveAll()
{
return From(x => x.FromResolveAll().AsCached());
}
public SignalCopyBinder FromNew()
{
return From(x => x.FromNew().AsCached());
}
public SignalCopyBinder From(Action<ConcreteBinderGeneric<TObject>> objectBindCallback)
{
Assert.That(!_bindStatement.HasFinalizer);
_bindStatement.SetFinalizer(new NullBindingFinalizer());
var objectLookupId = Guid.NewGuid();
// Very important here that we use NoFlush otherwise the main binding will be finalized early
var objectBinder = _container.BindNoFlush<TObject>().WithId(objectLookupId);
objectBindCallback(objectBinder);
// We need to do this to make sure SignalCallbackWithLookupWrapper does not have
// generic types to avoid AOT issues
Func<object, Action<object>> methodGetterMapper =
obj => s => _methodGetter((TObject)obj)((TSignal)s);
var wrapperBinder = _container.Bind<IDisposable>()
.To<SignalCallbackWithLookupWrapper>()
.AsCached()
.WithArguments(_signalBindInfo, typeof(TObject), objectLookupId, methodGetterMapper)
.NonLazy();
var copyBinder = new SignalCopyBinder( wrapperBinder.BindInfo);
// Make sure if they use one of the Copy/Move methods that it applies to both bindings
copyBinder.AddCopyBindInfo(objectBinder.BindInfo);
return copyBinder;
}
}
}