Example #1
0
        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));
        }
Example #2
0
        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>");
            }
        }