public void ShouldDoNothingOnCleanupIfInitializerInstanceIsNotSet() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action"); executor.ExecuteCleanupForAction(action); }
private void ApplicationStartup(object sender, StartupEventArgs e) { Exit += (o, args) => ExitAction.Invoke(); Window.Show(); InitializationAction.Invoke(); // DataBase.GetCollection<AlgorithmResult>().DeleteAll(); }
public void ShouldThrowInvalidOperationExceptionIfThereIsNoConstructorThatMatchesArguments() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new InitializationHandler(typeof(SimpleInitializer), new object[] { 1 }) }; Assert.ThrowsDelegate routine = () => executor.ExecuteInitializationForAction(action); Assert.Throws<InvalidOperationException>(routine); }
public void ShouldThrowExceptionOnInitializationIfActionStateIsNotAnInitializationHandler() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction initializationAction = new InitializationAction("System.String,mscorlib") { State = "a" }; Assert.ThrowsDelegate action = () => executor.ExecuteInitializationForAction(initializationAction); Assert.Throws<ArgumentException>(action); }
public void ShouldDoNothingOnCleanupIfInitializerInstanceCannotBeDisposed() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new SimpleInitializer() }; executor.ExecuteCleanupForAction(action); }
public void ShouldThrowInvalidOperationExceptionIfThereIsNoConstructorThatMatchesArguments() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new InitializationHandler(typeof(SimpleInitializer), new object[] { 1 }) }; Assert.ThrowsDelegate routine = () => executor.ExecuteInitializationForAction(action); Assert.Throws <InvalidOperationException>(routine); }
public void ShouldCreateInitializerInstanceOnInitializationAndSaveItIntoActionsState() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new InitializationHandler(typeof(SimpleInitializer), new object[0]) }; SimpleInitializer.Parameter = null; executor.ExecuteInitializationForAction(action); Assert.NotNull(SimpleInitializer.Parameter); Assert.Equal(string.Empty, SimpleInitializer.Parameter); }
public void ShouldThrowExceptionOnInitializationIfActionStateIsNotAnInitializationHandler() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction initializationAction = new InitializationAction("System.String,mscorlib") { State = "a" }; Assert.ThrowsDelegate action = () => executor.ExecuteInitializationForAction(initializationAction); Assert.Throws <ArgumentException>(action); }
/// <summary> /// Executes cleanup operation for the action. /// </summary> /// <param name="action">The action.</param> public virtual void ExecuteCleanupForAction(InitializationAction action) { if (action == null) { throw new ArgumentNullException("action"); } IDisposable disposableCandidate = action.State as IDisposable; if (disposableCandidate != null) { disposableCandidate.Dispose(); } }
public void ShouldCreateInitializerInstanceUsingParametersOnInitializationAndSaveItIntoActionsState(Type initializerType) { const string Parameter = "parameter"; InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new InitializationHandler(initializerType, new object[] { Parameter }) }; SimpleInitializer.Parameter = null; executor.ExecuteInitializationForAction(action); Assert.NotNull(SimpleInitializer.Parameter); Assert.Equal(Parameter, SimpleInitializer.Parameter); }
public void ShouldDisposeInitializerInstanceOnCleanup() { InitializationActionExecutor executor = new InitializationActionExecutor(); InitializationAction action = new InitializationAction("Action") { State = new DisposibleInitializer() }; DisposibleInitializer.Disposed = false; executor.ExecuteCleanupForAction(action); Assert.True(DisposibleInitializer.Disposed); }
public void ShouldSetInitializationContextIfInitializationHandlerImplementsIInitializationContextAware() { InitializationActionExecutor executor = new InitializationActionExecutor(); TestInitializationContext context = new TestInitializationContext(null, typeof(string).GetMethod("Intern"), new object[0]); InitializationAction action = new InitializationAction("Action") { State = new InitializationHandler(typeof(InitializationContextAwareInitializer), new object[0]), Context = context }; InitializationContextAwareInitializer.InitializationContext = null; executor.ExecuteInitializationForAction(action); Assert.Equal(context, InitializationContextAwareInitializer.InitializationContext); }
/// <summary> /// Executes initialization for the action. /// </summary> /// <param name="action">The action.</param> public virtual void ExecuteInitializationForAction(InitializationAction action) { if (action == null) { throw new ArgumentNullException("action"); } InitializationHandler initializationHandler = action.State as InitializationHandler; if (initializationHandler == null) { throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Action in not in a proper state. It's 'State' property should be of type '{0}' and should not be null.", typeof(InitializationHandler))); } Type[] argumentTypes = new Type[initializationHandler.Arguments.Length]; for (int index = 0; index < initializationHandler.Arguments.Length; ++index) { argumentTypes[index] = initializationHandler.Arguments[index].GetType(); } ConstructorInfo constructor = initializationHandler.Type.GetConstructor(argumentTypes); if (constructor == null) { constructor = initializationHandler.Type.GetConstructor(new[] { typeof(object[]) }); if (constructor == null) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Failed to create an instance of '{0}' type. No constructor found that matches the list of parameters.", initializationHandler.Type.AssemblyQualifiedName)); } action.State = constructor.Invoke(new object[] { initializationHandler.Arguments }); } else { action.State = constructor.Invoke(initializationHandler.Arguments); } IInitializationContextAware contextAwareInitializer = action.State as IInitializationContextAware; if (contextAwareInitializer != null) { contextAwareInitializer.SetInitializationContext(action.Context); } }
private void m_model_ModelInitializing(IModel model, object userData) { lock (_token){ m_generation++; IList dependentList = m_gs.GetServiceSequenceList(); IList independentList = m_zeroDependencyInitializers; if (m_generation == 0) { ValidateModel(dependentList); } Clear(); InitializationBeginning?.Invoke(m_generation); // First call into the ones that don't need it. foreach (object[] oa in independentList) { Initializer initializer = (Initializer)oa[0]; object[] parameters = (object[])oa[1]; InitializationAction?.Invoke(initializer, parameters); initializer(model, parameters); } // Next walk through the ones that do, in an appropriate sequence. try { foreach (Dv dv in dependentList) { InitializationAction?.Invoke(dv.Initializer, dv.Parameters); dv.PerformInitialization(model); } } catch (GraphCycleException gce) { IList cycleMembers = (ArrayList)gce.Members; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for (int i = 0; i < cycleMembers.Count; i++) { if (i != 0) { sb.Append("->"); } object target = ((Dv)cycleMembers[i]).Initializer.Target; Type mbrType = target.GetType(); string name = null; System.Reflection.PropertyInfo nameProp = mbrType.GetProperty("Name"); if (nameProp == null) { name = "(unknown " + cycleMembers[i].GetType().Name + ")"; } else { name = (string)nameProp.GetValue(target, new object[] {}); } sb.Append(name); } throw new ApplicationException("Failure to initialize due to a cyclical dependency involving [...->" + sb + "->...]."); //string cycle = FindCycle(cyclist); //Console.WriteLine("Cycle is " + cycle + "."); } // If more initializers have been added during this generation, run another generation of initialization. if (m_gs.GetServiceSequenceList().Count > 0 || m_zeroDependencyInitializers.Count > 0) { m_model_ModelInitializing(model, userData); } if (m_generation == 0) { InitializationCompleted?.Invoke(m_generation); } m_generation--; } // End of lock. // When all initialization iterations have completed... }