I don't think you need to actually call GetInvocationList since the delegates 
are all combined to appear as a single item:

// 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;

    // should process _all_ the listeners
    handlers(this, eventArgs);

    return eventArgs.ResultObject;
}


----- Original Message ----
From: Ron Grabowski <[EMAIL PROTECTED]>
To: dev@ibatis.apache.org
Sent: Monday, June 9, 2008 12:40:50 PM
Subject: Re: svn commit: r664536 [1/4]...EventHandler/EventArgs?


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

Reply via email to