Delegates are only fire and forget if you BeginInvoke them...this is a sequential implementation:
// TODO: change this over to use generics protected virtual object RaisePreInsert(object parameterObject, object resultObject) { EventHandler<StatementEventArgs> handlers = (EventHandler<StatementEventArgs>)events[PreInsertEvent]; StatementEventArgs eventArgs = new StatementEventArgs(); eventArgs.MappedStatement = this; eventArgs.ResultObject = resultObject; eventArgs.ParameterObject = parameterObject; foreach (EventHandler handler in handlers.GetInvocationList()) { handler.Invoke(this, eventArgs); } return eventArgs.ResultObject; } Each subscriber should be able to update/change/proxy ResultObject before its returned: mappedStatement.PreInsert += (s, e) => { ((User)e.ResultObject).CreatedDate = DateTime.Now ; } mappedStatement.PreInsert += (s, e) => { e.ResultObject = createProxy((User)e.ResultObject); } ----- Original Message ---- From: Gilles Bayon <[EMAIL PROTECTED]> To: dev@ibatis.apache.org Sent: Monday, June 9, 2008 2:20:20 AM Subject: Re: svn commit: r664536 [1/4]...EventHandler/EventArgs? The .NET event pattern cannot be used here, it follows the pattern fire and forget, and it's not what I'm searching as I want to be able to interact with the DataMapper workflow engine, you must see them as extension point where you can change the items that the engine is working on. It can be used for all sorts of cross-cutting concerns Example, replace the resultMap object instance by a proxy one, add/change arguments used by the constructor in the resultMap... private class MyPreCreateEventListener : PreCreateEventListener { /// <summary> /// Calls before creating an instance of the <see cref="IResultMap"/> object. /// </summary> /// <param name="evnt">The event.</param> /// <returns> /// Returns is used as constructor arguments for the instance being created /// </returns> public override object OnEvent(PreCreateEvent evnt) { evnt.Parameters[evnt.Parameters.Length-1] = "new lastName"; return evnt.Parameters; } } Example private class MyPreInsertEventListener :PreInsertEventListener { /// <summary> /// Calls on the specified event. /// </summary> /// <param name="evnt">The event.</param> /// <returns>Returns is used as the parameter object</returns> public override object OnEvent(PreInsertEvent evnt) { IDomain domain = evnt.ParameterObject as IDomain; if (domain != null) { ProcessBeforeInsert(domain); } return account; } private void ProcessBeforeInsert(IDomain domain) { User user = (User) Thread.CurrentPrincipal; domain.CreatedBy = user.UserName; domain.ModifiedBy = user.UserName; domain.CreatedDate = DateTime.Now; domain.ModifiedDate = DateTime.Now; } } -- Cheers, Gilles