-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFactoryWrapper.cs
97 lines (87 loc) · 3.52 KB
/
FactoryWrapper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections;
using System.Data;
using System.Data.Common;
namespace SqlProfiler
{
/// <summary>
/// Generic <see cref="DbProviderFactory"/> wrapper
/// </summary>
abstract public class FactoryWrapper : DbProviderFactory
{
/// <summary>
/// The wrapped factory
/// </summary>
protected DbProviderFactory Wrapped;
/// <summary>
/// Constructor
/// </summary>
/// <param name="wrapped">The factory to wrap</param>
public FactoryWrapper(DbProviderFactory wrapped)
{
Wrapped = wrapped;
}
/// <summary>
/// Wrap database commands
/// </summary>
/// <param name="wrapped">The command to wrap</param>
/// <returns></returns>
abstract public CommandWrapper WrapCommand(DbCommand wrapped);
/// <summary>
/// Wrapped <see cref="DbProviderFactory.CreateCommand"/> method, with <see cref="PreCreateCommand(DbProviderFactory)"/> and <see cref="PostCreateCommand(DbProviderFactory, object)"/> hooks
/// </summary>
/// <returns></returns>
public override DbCommand CreateCommand()
{
var profilingObject = PreCreateCommand(Wrapped);
var command = Wrapped.CreateCommand();
var wrapped = WrapCommand(command);
PostCreateCommand(Wrapped, profilingObject);
return wrapped;
}
/// <summary>
/// Pre-<see cref="DbProviderFactory.CreateCommand"/> hook
/// </summary>
/// <param name="factory">The wrapped factory</param>
/// <returns></returns>
public virtual object PreCreateCommand(DbProviderFactory factory) { return null; }
/// <summary>
/// Post-<see cref="DbProviderFactory.CreateCommand"/> hook
/// </summary>
/// <param name="factory">The wrapped factory</param>
/// <param name="profilingObject">Whatever was returned from the pre-method hook</param>
/// <returns></returns>
public virtual void PostCreateCommand(DbProviderFactory factory, object profilingObject) {}
/// <summary>
/// NB Returns non-wrapped connection object. TO DO: Make this return ConnectionWrapper.
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
abstract public DbConnection WrapConnection(DbConnection connection);
/// <summary>
/// <see cref="DbProviderFactory.CreateConnection"/> hook, with <see cref="PreCreateConnection(DbProviderFactory)"/> and <see cref="PostCreateConnection(DbProviderFactory, object)"/> hooks
/// </summary>
/// <returns></returns>
public override DbConnection CreateConnection()
{
var profilingObject = PreCreateConnection(Wrapped);
var connection = Wrapped.CreateConnection();
var wrapped = WrapConnection(connection);
PostCreateConnection(Wrapped, profilingObject);
return wrapped;
}
/// <summary>
/// Pre-<see cref="DbProviderFactory.CreateConnection"/> hook
/// </summary>
/// <param name="factory">The wrapped factory</param>
/// <returns></returns>
public virtual object PreCreateConnection(DbProviderFactory factory) { return null; }
/// <summary>
/// Pre-<see cref="DbProviderFactory.CreateConnection"/> hook
/// </summary>
/// <param name="factory">The wrapped factory</param>
/// <param name="profilingObject">Whatever was returned from the pre-method hook</param>
/// <returns></returns>
public virtual void PostCreateConnection(DbProviderFactory factory, object profilingObject) { }
}
}