Daniel T.
Daniel T.

Reputation: 38400

How do I combine similar method calls into a delegate pattern?

I have three methods:

public void Save<T>(T entity)
{
    using (new Transaction())
    {
        Session.Save(entity);
    }
}

public void Create<T>(T entity)
{
    using (new Transaction())
    {
        Session.Create(entity);
    }
}

public void Delete<T>(T entity)
{
    using (new Transaction())
    {
        Session.Delete(entity);
    }
}

As you can see, the only thing that differs is the method call inside the using block. How can I rewrite this so it's something like this instead:

public void Save<T>(T entity)
{
    TransactionWrapper(Session.Save(entity));
}

public void Create<T>(T entity)
{
    TransactionWrapper(Session.Create(entity));
}

public void Save<T>(T entity)
{
    TransactionWrapper(Session.Save(entity));
}

So in other words, I pass a method call as a parameter, and the TransactionWrapper method wraps a transaction around the method call.

Upvotes: 3

Views: 253

Answers (1)

dtb
dtb

Reputation: 217293

You can pass an Action<T> to a method to specify an action to execute:

private void ExecuteInTransaction<T>(Action<T> action, T entity)
{
    using (new Transaction())
    {
        action(entity);
    }
}

public void Save<T>(T entity)
{
    ExecuteInTransaction(Session.Save, entity);
}

But IMO this isn't a worthy improvement over your original code if your ExecuteInTransaction method isn't more complex.

Upvotes: 4

Related Questions