我决定自己做一个轻型DI容器。
我知道Zenject,等等,我想要一个非常轻的模拟。
我担心几件事:
1)在这种情况下,使用结构而不是类作为参考是正确的吗?
2)每次访问_player.Reference时,都会检查null (在UnityEngine.After中,对象的销毁不等于null,所以使用SafeIsUnityNull)
( 3)双点。我可以让操作符超载,这样它就可以代替_player.Reference.AAAAAAAAAAAAA();工作_player.AAAAAAAAAAAAA();了吗??
容器本身:
public static class DIContainer
{
private static readonly Dictionary<System.Type, Object> _references = new Dictionary<System.Type, Object>();
public static void Bind<T>(T value) where T : Object
{
_references[typeof(T)] = value;
}
public static T Resolve<T>() where T : Object
{
if (_references.TryGetValue(typeof(T), out Object value))
return (T)value;
throw new System.InvalidCastException($"DIContainer: invalid resolve object {typeof(T)}");
}
}实地参考资料:
public struct DIReference<T> where T : Object
{
private T _reference;
public T Reference => !_reference.SafeIsUnityNull() ? _reference : _reference = DIContainer.Resolve<T>();
}安装程序:
public abstract class SceneInstaller : MonoBehaviour
{
private void Awake() => InstallBindings();
protected abstract void InstallBindings();
}public class LevelInstaller : SceneInstaller
{
}使用
绑定:
[SerializeField] private PlayerController _player;
protected override void InstallBindings()
{
DIContainer.Bind(_player);
}参考资料:
public class Test
{
private DIReference<PlayerController> _player;
private void Foo()
{
_player.Reference.AAAAAAAAAAAAA();
}
}发布于 2020-05-05 11:21:14
实际上,您要做的是实现Service,这与依赖注入完全相反。请参阅[这个]关于它的讨论。
我只想指出为什么我认为这不适合你的情况:
我强烈建议使用已经存在的DI解决方案。如果您担心性能,请参考[这个] benchamrks。
https://codereview.stackexchange.com/questions/241389
复制相似问题