Я сделал это, используя шаблон декоратора, который украшает IDbProvider для предоставления необходимого метода:
public abstract class LongQueriesDecorator : IDbProvider
{
protected IDbProvider _iDbProvider;
public void setDbProvider(IDbProvider iDbProvider)
{
this._iDbProvider = iDbProvider;
}
public abstract void setCommandTimeout(IDbCommand cmd);
// implement all IDbProvider methods calling _iDbProvider.METHOD
// ...
// except for
public IDbCommand CreateCommand()
{
if (_iDbProvider != null)
{
IDbCommand cmd = _iDbProvider.CreateCommand();
// here you can call the delegate
setCommandTimeout(cmd);
return cmd;
}
else
{
return null;
}
}
// ...
}
Тогда реализуйте абстрактный класс:
public class LongQueries : LongQueriesDecorator
{
public override void setCommandTimeout(IDbCommand cmd)
{
cmd.CommandTimeout = 1000; // here you can configure a value in the App.config
}
}
И, наконец, при построении картографа:
_mapper = builder.Configure(sqlMapConfig);
LongQueries lq = new LongQueries();
lq.setDbProvider(_mapper.DataSource.DbProvider);
_mapper.DataSource.DbProvider = lq;