public static (InjectionLayer, InjectableAttribute) GetInjectionLayer(FieldInfo fieldInfo) { InjectableAttribute injectableAttribute = fieldInfo.FieldType.GetCustomAttribute <InjectableAttribute>(); if (injectableAttribute == null) { throw Log.Exception($"Class <b>{fieldInfo.FieldType.Name}</b> is missing <b>Injectable</b> attribute"); } Type type = injectableAttribute.Layer; if (injectionLayers.ContainsKey(type)) { return(injectionLayers[type], injectableAttribute); } CreateLayer(type); return(GetInjectionLayer(fieldInfo)); }
public void InjectIntoField(FieldInfo fieldInfo, InjectableAttribute injectableAttribute, object @object) { object injectedInstance; if (injectableAttribute.Singleton) { if (dependencies.ContainsKey(fieldInfo.FieldType)) { injectedInstance = dependencies[fieldInfo.FieldType]; } else { if (fieldInfo.FieldType.IsSubclassOf(typeof(MonoBehaviour))) { injectedInstance = Object.FindObjectOfType(fieldInfo.FieldType); if (injectedInstance == null) { injectedInstance = new GameObject().AddComponent(fieldInfo.FieldType); MonoBehaviour.DontDestroyOnLoad(((MonoBehaviour)injectedInstance).gameObject); } } else { injectedInstance = Activator.CreateInstance(fieldInfo.FieldType); } } if (injectedInstance == null) { throw Log.Exception( $"Something went wrong while trying to assign " + $"Service of type <b>{fieldInfo.FieldType}</b>"); } dependencies[fieldInfo.FieldType] = injectedInstance; // Track all singletons if (!singletons.Contains(injectedInstance)) { singletons.Add(injectedInstance); } // Track references to this singleton injected instance if (references.ContainsKey(injectedInstance)) { if (references[injectedInstance].Contains(@object)) { throw Log.Exception( $"Trying to use the same Service of type " + $"<b>{fieldInfo.FieldType}</b> twice in <b>{@object}</b>"); } references[injectedInstance].Add(@object); } else { references[injectedInstance] = new List <object> { @object }; } } else { if (fieldInfo.FieldType.IsSubclassOf(typeof(MonoBehaviour))) { throw Log.Exception($"Non-Singleton Monobehaviour support is not added yet!" + $"Please change <b>{fieldInfo.FieldType.Name}</b> to be a <b>Singleton</b> Injectable"); } // TODO: Add Monobehaviour support injectedInstance = Activator.CreateInstance(fieldInfo.FieldType); Log.Write($"Non-Singleton <b>{injectedInstance.GetType().Name}</b> was created"); } fieldInfo.SetValue(@object, injectedInstance); if (injectableAttribute.Singleton) { Log.Write($"Injected <i>Singleton</i> instance <b>{injectedInstance.GetType().Name}</b> " + $"into <b>{@object.GetType().Name}</b> -- " + $"Has <b>{references[injectedInstance].Count}</b> reference(s)"); } else { Log.Write($"Created instance <b>{injectedInstance.GetType().Name}</b> -- " + $"Was injected into <b>{@object.GetType().Name}</b>"); } }