diff --git a/Source/MonoGame.Extended.Entities/DefaultDependencyResolver.cs b/Source/MonoGame.Extended.Entities/DefaultDependencyResolver.cs new file mode 100644 index 00000000..e7b46b1f --- /dev/null +++ b/Source/MonoGame.Extended.Entities/DefaultDependencyResolver.cs @@ -0,0 +1,16 @@ +using System; + +namespace MonoGame.Extended.Entities +{ + public class DefaultDependencyResolver : DependencyResolver + { + public DefaultDependencyResolver() + { + } + + public override object Resolve(Type type, params object[] args) + { + return Activator.CreateInstance(type, args); + } + } +} \ No newline at end of file diff --git a/Source/MonoGame.Extended.Entities/DependencyResolver.cs b/Source/MonoGame.Extended.Entities/DependencyResolver.cs new file mode 100644 index 00000000..aba9dd95 --- /dev/null +++ b/Source/MonoGame.Extended.Entities/DependencyResolver.cs @@ -0,0 +1,14 @@ +using System; + +namespace MonoGame.Extended.Entities +{ + public abstract class DependencyResolver + { + public abstract object Resolve(Type type, params object[] args); + + public T Resolve(Type type, params object[] args) + { + return (T)Resolve(type, args); + } + } +} \ No newline at end of file diff --git a/Source/MonoGame.Extended.Entities/EntityComponentSystem.cs b/Source/MonoGame.Extended.Entities/EntityComponentSystem.cs index 2b4286a1..c16ebe41 100644 --- a/Source/MonoGame.Extended.Entities/EntityComponentSystem.cs +++ b/Source/MonoGame.Extended.Entities/EntityComponentSystem.cs @@ -40,14 +40,16 @@ namespace MonoGame.Extended.Entities public sealed class EntityComponentSystem : DrawableGameComponent { private readonly SystemManager _systemManager; + private readonly DependencyResolver _dependencyResolver; public EntityManager EntityManager { get; } - public EntityComponentSystem(Game game) + public EntityComponentSystem(Game game, DependencyResolver dependencyResolver = null) : base(game) { + _dependencyResolver = dependencyResolver ?? new DefaultDependencyResolver(); _systemManager = new SystemManager(this); - EntityManager = new EntityManager(_systemManager); + EntityManager = new EntityManager(_systemManager, _dependencyResolver); } // don't call this every frame, lol @@ -153,7 +155,6 @@ namespace MonoGame.Extended.Entities foreach (var typeInfo in entityTempalteTypeInfos) { - EntityTemplateAttribute entityTemplateAttribute = null; var attributes = typeInfo.GetCustomAttributes(false); @@ -168,7 +169,7 @@ namespace MonoGame.Extended.Entities if (entityTemplateAttribute == null) return; - var entityTemplate = (EntityTemplate)Activator.CreateInstance(typeInfo.AsType()); + var entityTemplate = _dependencyResolver.Resolve(typeInfo.AsType()); EntityManager.AddEntityTemplate(entityTemplateAttribute.Name, entityTemplate); } } @@ -223,7 +224,7 @@ namespace MonoGame.Extended.Entities if (systemAttribute == null) return; - var system = (EntitySystem)Activator.CreateInstance(typeInfo.AsType()); + var system = _dependencyResolver.Resolve(typeInfo.AsType()); var processingSystem = system as EntityProcessingSystem; if (processingSystem != null) processingSystem.Aspect = new Aspect(andMask, orMask, norMask); diff --git a/Source/MonoGame.Extended.Entities/EntityManager.cs b/Source/MonoGame.Extended.Entities/EntityManager.cs index c114fb1e..9e7621f0 100644 --- a/Source/MonoGame.Extended.Entities/EntityManager.cs +++ b/Source/MonoGame.Extended.Entities/EntityManager.cs @@ -44,6 +44,7 @@ namespace MonoGame.Extended.Entities { public class EntityManager { + private readonly DependencyResolver _dependencyResolver; private readonly SystemManager _systemManager; private readonly ObjectPool _pool; private readonly Dictionary _entitiesByName; @@ -65,8 +66,9 @@ namespace MonoGame.Extended.Entities public event EntityDelegate EntityRemoved; public event EntityDelegate EntityDestroyed; - internal EntityManager(SystemManager systemManager) + internal EntityManager(SystemManager systemManager, DependencyResolver dependencyResolver) { + _dependencyResolver = dependencyResolver; _systemManager = systemManager; _pool = new ObjectPool(CreateEntityObject, 100, ObjectPoolIsFullPolicy.IncreaseSize); @@ -311,7 +313,7 @@ namespace MonoGame.Extended.Entities } else { - component = (EntityComponent)Activator.CreateInstance(componentType.Type); + component = _dependencyResolver.Resolve(componentType.Type); } component.Entity = entity; @@ -457,7 +459,7 @@ namespace MonoGame.Extended.Entities Debug.Assert(!_componentPoolsByComponentTypeIndex.ContainsKey(componentType.Index)); var poolType = typeof(ComponentPool<>).MakeGenericType(componentType.Type); - var componentPool = (IComponentPool)Activator.CreateInstance(poolType, initialSize, isFullPolicy); + var componentPool = (IComponentPool)_dependencyResolver.Resolve(poolType, initialSize, isFullPolicy); _componentPoolsByComponentTypeIndex.Add(componentType.Index, componentPool); } diff --git a/Source/MonoGame.Extended.Entities/MonoGame.Extended.Entities.csproj b/Source/MonoGame.Extended.Entities/MonoGame.Extended.Entities.csproj index 12276f8c..971d00c9 100644 --- a/Source/MonoGame.Extended.Entities/MonoGame.Extended.Entities.csproj +++ b/Source/MonoGame.Extended.Entities/MonoGame.Extended.Entities.csproj @@ -52,6 +52,8 @@ + +