public SystemsManager( IPluginManager pluginManager, ILogManager logManager, INGinCore core, IMainLoopManager mainLoopManager ) { this.LogManager = logManager; foreach ( SystemAttribute plugin in pluginManager.GetPluginsForType( typeof( SystemAttribute ) ) ) { // create and store system //ConstructorInfo constructor = plugin.SystemType.GetConstructor( plugin.ConstructorParameterTypes ); //ISystem system = plugin.SystemType.InvokeMember( plugin.SystemType.Name, global::System.Reflection.BindingFlags.CreateInstance, null, null, new object[] { this.LogManager } ) as ISystem; ISystem system = core.GetService( plugin.SystemType ) as ISystem; lock ( this.registeredSystemsLock ) { this.registeredSystems.Add( system.Name, system ); } } }
internal void Initialize( IPluginManager pluginManager, IMachine stateMachine, INGinCore core ) { // ensure plugin manager is not null if ( pluginManager == null ) { string message = "The plugin manager must not be null."; ArgumentNullException argnEx = new ArgumentNullException( "logManager", message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, argnEx, message ); throw argnEx; } // ensure state machine is not null if ( stateMachine == null ) { string message = "The state machine must not be null."; ArgumentNullException argnEx = new ArgumentNullException( "stateMachine", message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, argnEx, message ); throw argnEx; } if ( core == null ) { string message = "The core must not be null."; ArgumentNullException argnEx = new ArgumentNullException( "core", message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, argnEx, message ); throw argnEx; } IEnumerable<Attribute> statePlugins = pluginManager.GetPluginsForType( typeof( NGinRootStateAttribute ) ); // ensure that only one root state is defined if ( statePlugins.Count<Attribute>() > 1 ) { string message = "More than one root state plugin was found. There must be only 1."; InvalidOperationException invOpEx = new InvalidOperationException( message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, invOpEx, message ); throw invOpEx; } // get attribute NGinRootStateAttribute rootStateAtt = statePlugins.ElementAt<Attribute>( 0 ) as NGinRootStateAttribute; // make sure attribute is not null if ( rootStateAtt == null ) { string message = "Error loading the root state plugin."; InvalidOperationException invOpEx = new InvalidOperationException( message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, invOpEx, message ); throw invOpEx; } // add type to machine root Type rootStateType = rootStateAtt.RootStateType; IState state = core.GetService( rootStateType ) as IState; if ( state == null ) { string message = String.Format( System.Globalization.CultureInfo.InvariantCulture, "An error occurred while retrieving instance of {0}.", rootStateType.FullName ); InvalidOperationException invopEx = new InvalidOperationException( message ); this.LogManager.Trace( Namespace.LoggerName, LogLevel.Error, invopEx, message ); throw invopEx; } this.StateMachine.RootState.AddSubState( state ); stateMachine.Initialize( state.Name ); }