Skip to content

Commit 1d508bc

Browse files
committed
Add overload with an IServiceProvider parameter. Fixes #1316
1 parent e855216 commit 1d508bc

File tree

2 files changed

+101
-10
lines changed

2 files changed

+101
-10
lines changed

src/MySqlConnector.DependencyInjection/MySqlConnectorServiceCollectionExtensions.cs

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static IServiceCollection AddMySqlDataSource(
2323
string connectionString,
2424
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
2525
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
26-
DoAddMySqlDataSource(serviceCollection, connectionString, dataSourceBuilderAction: null, connectionLifetime, dataSourceLifetime);
26+
DoAddMySqlDataSource(serviceCollection, connectionString, dataSourceBuilderAction: null, connectionLifetime, dataSourceLifetime, builderActionState: null);
2727

2828
/// <summary>
2929
/// Registers a <see cref="MySqlDataSource" /> and a <see cref="MySqlConnection" /> in the <see cref="IServiceCollection" />.
@@ -40,7 +40,24 @@ public static IServiceCollection AddMySqlDataSource(
4040
Action<MySqlDataSourceBuilder> dataSourceBuilderAction,
4141
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
4242
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
43-
DoAddMySqlDataSource(serviceCollection, connectionString, dataSourceBuilderAction, connectionLifetime, dataSourceLifetime);
43+
DoAddMySqlDataSource(serviceCollection, connectionString, DataSourceBuilderThunk, connectionLifetime, dataSourceLifetime, builderActionState: dataSourceBuilderAction);
44+
45+
/// <summary>
46+
/// Registers a <see cref="MySqlDataSource" /> and a <see cref="MySqlConnection" /> in the <see cref="IServiceCollection" />.
47+
/// </summary>
48+
/// <param name="serviceCollection">The <see cref="IServiceCollection" /> to add services to.</param>
49+
/// <param name="connectionString">A MySQL connection string.</param>
50+
/// <param name="dataSourceBuilderAction">An action to configure the <see cref="MySqlDataSourceBuilder" /> for further customizations of the <see cref="MySqlDataSource" />.</param>
51+
/// <param name="connectionLifetime">The lifetime with which to register the <see cref="MySqlConnection" /> in the container. Defaults to <see cref="ServiceLifetime.Transient" />.</param>
52+
/// <param name="dataSourceLifetime">The lifetime with which to register the <see cref="MySqlDataSource" /> service in the container. Defaults to <see cref="ServiceLifetime.Singleton" />.</param>
53+
/// <returns>The same service collection so that multiple calls can be chained.</returns>
54+
public static IServiceCollection AddMySqlDataSource(
55+
this IServiceCollection serviceCollection,
56+
string connectionString,
57+
Action<IServiceProvider, MySqlDataSourceBuilder> dataSourceBuilderAction,
58+
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
59+
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
60+
DoAddMySqlDataSource(serviceCollection, connectionString, ServiceProviderDataSourceBuilderThunk, connectionLifetime, dataSourceLifetime, builderActionState: dataSourceBuilderAction);
4461

4562
/// <summary>
4663
/// Registers a <see cref="MySqlDataSource" /> and a <see cref="MySqlConnection" /> in the <see cref="IServiceCollection" />.
@@ -58,7 +75,7 @@ public static IServiceCollection AddKeyedMySqlDataSource(
5875
string connectionString,
5976
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
6077
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
61-
DoAddMySqlDataSource(serviceCollection, serviceKey, connectionString, dataSourceBuilderAction: null, connectionLifetime, dataSourceLifetime);
78+
DoAddMySqlDataSource(serviceCollection, serviceKey, connectionString, dataSourceBuilderAction: null, connectionLifetime, dataSourceLifetime, builderActionState: null);
6279

6380
/// <summary>
6481
/// Registers a <see cref="MySqlDataSource" /> and a <see cref="MySqlConnection" /> in the <see cref="IServiceCollection" />.
@@ -79,14 +96,36 @@ public static IServiceCollection AddKeyedMySqlDataSource(
7996
Action<MySqlDataSourceBuilder> dataSourceBuilderAction,
8097
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
8198
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
82-
DoAddMySqlDataSource(serviceCollection, serviceKey, connectionString, dataSourceBuilderAction, connectionLifetime, dataSourceLifetime);
99+
DoAddMySqlDataSource(serviceCollection, serviceKey, connectionString, DataSourceBuilderThunk, connectionLifetime, dataSourceLifetime, builderActionState: dataSourceBuilderAction);
100+
101+
/// <summary>
102+
/// Registers a <see cref="MySqlDataSource" /> and a <see cref="MySqlConnection" /> in the <see cref="IServiceCollection" />.
103+
/// </summary>
104+
/// <param name="serviceCollection">The <see cref="IServiceCollection" /> to add services to.</param>
105+
/// <param name="serviceKey">The <see cref="ServiceDescriptor.ServiceKey"/> of the service.</param>
106+
/// <param name="connectionString">A MySQL connection string.</param>
107+
/// <param name="dataSourceBuilderAction">An action to configure the <see cref="MySqlDataSourceBuilder" /> for further customizations of the <see cref="MySqlDataSource" />.</param>
108+
/// <param name="connectionLifetime">The lifetime with which to register the <see cref="MySqlConnection" /> in the container. Defaults to <see cref="ServiceLifetime.Transient" />.</param>
109+
/// <param name="dataSourceLifetime">The lifetime with which to register the <see cref="MySqlDataSource" /> service in the container. Defaults to <see cref="ServiceLifetime.Singleton" />.</param>
110+
/// <returns>The same service collection so that multiple calls can be chained.</returns>
111+
/// <remarks>If the <paramref name="serviceKey"/> is a <see langword="string"/>, it will automatically be used to initialize the data source name; this can
112+
/// be overridden by the <paramref name="dataSourceBuilderAction"/> configuration action.</remarks>
113+
public static IServiceCollection AddKeyedMySqlDataSource(
114+
this IServiceCollection serviceCollection,
115+
object? serviceKey,
116+
string connectionString,
117+
Action<IServiceProvider, MySqlDataSourceBuilder> dataSourceBuilderAction,
118+
ServiceLifetime connectionLifetime = ServiceLifetime.Transient,
119+
ServiceLifetime dataSourceLifetime = ServiceLifetime.Singleton) =>
120+
DoAddMySqlDataSource(serviceCollection, serviceKey, connectionString, ServiceProviderDataSourceBuilderThunk, connectionLifetime, dataSourceLifetime, builderActionState: dataSourceBuilderAction);
83121

84122
private static IServiceCollection DoAddMySqlDataSource(
85123
this IServiceCollection serviceCollection,
86124
string connectionString,
87-
Action<MySqlDataSourceBuilder>? dataSourceBuilderAction,
125+
Action<IServiceProvider, MySqlDataSourceBuilder, object?>? dataSourceBuilderAction,
88126
ServiceLifetime connectionLifetime,
89-
ServiceLifetime dataSourceLifetime)
127+
ServiceLifetime dataSourceLifetime,
128+
object? builderActionState)
90129
{
91130
serviceCollection.TryAdd(
92131
new ServiceDescriptor(
@@ -95,7 +134,7 @@ private static IServiceCollection DoAddMySqlDataSource(
95134
{
96135
var dataSourceBuilder = new MySqlDataSourceBuilder(connectionString)
97136
.UseLoggerFactory(serviceProvider.GetService<ILoggerFactory>());
98-
dataSourceBuilderAction?.Invoke(dataSourceBuilder);
137+
dataSourceBuilderAction?.Invoke(serviceProvider, dataSourceBuilder, builderActionState);
99138
return dataSourceBuilder.Build();
100139
},
101140
dataSourceLifetime));
@@ -115,9 +154,10 @@ private static IServiceCollection DoAddMySqlDataSource(
115154
this IServiceCollection serviceCollection,
116155
object? serviceKey,
117156
string connectionString,
118-
Action<MySqlDataSourceBuilder>? dataSourceBuilderAction,
157+
Action<IServiceProvider, MySqlDataSourceBuilder, object?>? dataSourceBuilderAction,
119158
ServiceLifetime connectionLifetime,
120-
ServiceLifetime dataSourceLifetime)
159+
ServiceLifetime dataSourceLifetime,
160+
object? builderActionState)
121161
{
122162
serviceCollection.TryAdd(
123163
new ServiceDescriptor(
@@ -128,7 +168,7 @@ private static IServiceCollection DoAddMySqlDataSource(
128168
var dataSourceBuilder = new MySqlDataSourceBuilder(connectionString)
129169
.UseLoggerFactory(serviceProvider.GetService<ILoggerFactory>())
130170
.UseName(serviceKey as string);
131-
dataSourceBuilderAction?.Invoke(dataSourceBuilder);
171+
dataSourceBuilderAction?.Invoke(serviceProvider, dataSourceBuilder, builderActionState);
132172
return dataSourceBuilder.Build();
133173
},
134174
dataSourceLifetime));
@@ -143,4 +183,10 @@ private static IServiceCollection DoAddMySqlDataSource(
143183

144184
return serviceCollection;
145185
}
186+
187+
private static void DataSourceBuilderThunk(IServiceProvider serviceProvider, MySqlDataSourceBuilder dataSourceBuilder, object? state) =>
188+
((Action<MySqlDataSourceBuilder>) state!)(dataSourceBuilder);
189+
190+
private static void ServiceProviderDataSourceBuilderThunk(IServiceProvider serviceProvider, MySqlDataSourceBuilder dataSourceBuilder, object? state) =>
191+
((Action<IServiceProvider, MySqlDataSourceBuilder>) state!)(serviceProvider, dataSourceBuilder);
146192
}

tests/MySqlConnector.DependencyInjection.Tests/DependencyInjectionTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,22 @@ public async Task MySqlDataSourceCanSetName()
7070
Assert.Equal("MyName", dataSource.Name);
7171
}
7272

73+
[Fact]
74+
public async Task MySqlDataSourceCanSetNameFromServiceProvider()
75+
{
76+
var serviceCollection = new ServiceCollection();
77+
78+
serviceCollection.AddSingleton("MyName");
79+
serviceCollection.AddMySqlDataSource(c_connectionString, (sp, builder) =>
80+
{
81+
builder.UseName(sp.GetRequiredService<string>());
82+
});
83+
84+
await using var serviceProvider = serviceCollection.BuildServiceProvider();
85+
var dataSource = serviceProvider.GetRequiredService<MySqlDataSource>();
86+
Assert.Equal("MyName", dataSource.Name);
87+
}
88+
7389
[Fact]
7490
public async Task KeyedMySqlDataSourceIsRegistered()
7591
{
@@ -98,6 +114,35 @@ public async Task StringKeyedMySqlDataSourceHasNameSet()
98114
Assert.Equal(c_connectionString, connection.ConnectionString);
99115
}
100116

117+
[Fact]
118+
public async Task KeyedMySqlDataSourceCanSetName()
119+
{
120+
var serviceCollection = new ServiceCollection();
121+
serviceCollection.AddKeyedMySqlDataSource("key", c_connectionString, builder => builder.UseName("MyName"));
122+
123+
await using var serviceProvider = serviceCollection.BuildServiceProvider();
124+
125+
var dataSource = serviceProvider.GetRequiredKeyedService<MySqlDataSource>("key");
126+
Assert.Equal("MyName", dataSource.Name);
127+
await using var connection = dataSource.CreateConnection();
128+
Assert.Equal(c_connectionString, connection.ConnectionString);
129+
}
130+
131+
[Fact]
132+
public async Task KeyedMySqlDataSourceCanSetNameFromServiceProvider()
133+
{
134+
var serviceCollection = new ServiceCollection();
135+
serviceCollection.AddSingleton("MyName");
136+
serviceCollection.AddKeyedMySqlDataSource("key", c_connectionString, (sp, builder) => builder.UseName(sp.GetRequiredService<string>()));
137+
138+
await using var serviceProvider = serviceCollection.BuildServiceProvider();
139+
140+
var dataSource = serviceProvider.GetRequiredKeyedService<MySqlDataSource>("key");
141+
Assert.Equal("MyName", dataSource.Name);
142+
await using var connection = dataSource.CreateConnection();
143+
Assert.Equal(c_connectionString, connection.ConnectionString);
144+
}
145+
101146
[Fact]
102147
public async Task KeyedMySqlDataSourceRetrievedWithStringKeyHasName()
103148
{

0 commit comments

Comments
 (0)