I'm designing an entity-component engine in C# right now, and all components need to have access to the global event manager, which sends off inter-entity events (every entity also has a local event manager).

I'd like to be able to simply call functions like this:

GlobalEventManager.Publish("Foo", new EventData());
GlobalEventManager.Subscribe("Bar", OnBarEvent);

without having to do this:

class HealthComponent
    private EventManager globalEventManager;

    public HealthComponent(EventManager gEM)
        globalEventManager = gEM;

// later on...
EventManager globalEventManager = new EventManager();
Entity playerEntity = new Entity();
playerEntity.AddComponent(new HealthComponent(globalEventManager));

How can I accomplish this?

  • 1
    \$\begingroup\$ Welcome to the site! I am glad you found a solution to your problem. I invite you to put the answer into an actual answer and mark it as the answer. The site more than allows for this :) \$\endgroup\$ – James Mar 19 '12 at 16:59
  • \$\begingroup\$ I've also removed the "SOLVED" tag from your question, as the proper way to indicate such on this site is to post an answer and accept it, as James said (probably you will need to wait until you question is a few more hours old before the system will let you do so). \$\endgroup\$ – user1430 Mar 19 '12 at 17:12
  • \$\begingroup\$ Yeah, I tried doing that and it said I had to wait 8 more hours. \$\endgroup\$ – jmegaffin Mar 19 '12 at 17:14
  • 2
    \$\begingroup\$ It's been more than 8 hours :) \$\endgroup\$ – MichaelHouse Oct 8 '12 at 3:17

Although your solution works, you are losing testability by using singleton. In addition you are highly coupled with your global objects. If you will ever think of unit tests for your new components, you will have specially prepare your GlobalEventManager and ensure that your tests are not run in parallel.

One option is to use Factory pattern. Something like:


Or read about dependency injection frameworks.


Why not just use C#'s native event system? That way any components that want to subscribe to a component's events can do so from outside the class.

  • \$\begingroup\$ My own system works perfectly well and it's already very similar to C#'s events. The difference is that I have full control over it. I just want a way to call methods from an API object. \$\endgroup\$ – jmegaffin Mar 19 '12 at 16:32
  • \$\begingroup\$ @Boreal Pass the API object to every object that calls its methods. \$\endgroup\$ – Zolomon Mar 19 '12 at 16:46
  • \$\begingroup\$ @Boreal Singletons are killer for unit testing, I highly recommend finding a different approach. \$\endgroup\$ – mike Mar 20 '12 at 10:06

I solved it by creating a singleton called GlobalEventManager. It derives from the local EventManager class and I use it like this:

GlobalEventManager.Instance.Publish("Foo", new EventData());

Thanks Byte :p


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.