Skip to content

Commit 47edb9d

Browse files
Merge pull request #88 from johelvisguzman/adonet-configmanager
Allow ado-net repository to be instantiated using only a connection string
2 parents b369485 + 125e1d3 commit 47edb9d

File tree

28 files changed

+148
-60
lines changed

28 files changed

+148
-60
lines changed

src/DotNetToolkit.Repository.AdoNet/AdoNetRepository.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,26 @@ public class AdoNetRepository<TEntity, TKey> : AdoNetRepositoryBase<TEntity, TKe
99
{
1010
#region Constructors
1111

12+
/// <summary>
13+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
14+
/// </summary>
15+
/// <param name="connectionString">The connection string.</param>
16+
public AdoNetRepository(string connectionString) : base(connectionString) { }
17+
1218
/// <summary>
1319
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
1420
/// </summary>
1521
/// <param name="providerName">The name of the provider.</param>
1622
/// <param name="connectionString">The connection string.</param>
1723
public AdoNetRepository(string providerName, string connectionString) : base(providerName, connectionString) { }
1824

25+
/// <summary>
26+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
27+
/// </summary>
28+
/// <param name="connectionString">The connection string.</param>
29+
/// <param name="logger">The logger.</param>
30+
public AdoNetRepository(string connectionString, ILogger logger) : base(connectionString, logger) { }
31+
1932
/// <summary>
2033
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
2134
/// </summary>
@@ -35,14 +48,27 @@ public class AdoNetRepository<TEntity> : AdoNetRepositoryBase<TEntity, int>, IRe
3548
#region Constructors
3649

3750
/// <summary>
38-
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
51+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity}" /> class.
52+
/// </summary>
53+
/// <param name="connectionString">The connection string.</param>
54+
public AdoNetRepository(string connectionString) : base(connectionString) { }
55+
56+
/// <summary>
57+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity}" /> class.
3958
/// </summary>
4059
/// <param name="providerName">The name of the provider.</param>
4160
/// <param name="connectionString">The connection string.</param>
4261
public AdoNetRepository(string providerName, string connectionString) : base(providerName, connectionString) { }
4362

4463
/// <summary>
45-
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity, TKey}" /> class.
64+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity}" /> class.
65+
/// </summary>
66+
/// <param name="connectionString">The connection string.</param>
67+
/// <param name="logger">The logger.</param>
68+
public AdoNetRepository(string connectionString, ILogger logger) : base(connectionString, logger) { }
69+
70+
/// <summary>
71+
/// Initializes a new instance of the <see cref="AdoNetRepository{TEntity}" /> class.
4672
/// </summary>
4773
/// <param name="providerName">The name of the provider.</param>
4874
/// <param name="connectionString">The connection string.</param>

src/DotNetToolkit.Repository.AdoNet/AdoNetRepositoryBase.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System;
1111
using System.Collections.Concurrent;
1212
using System.Collections.Generic;
13+
using System.Configuration;
1314
using System.Data;
1415
using System.Data.Common;
1516
using System.Linq;
@@ -66,6 +67,26 @@ public abstract class AdoNetRepositoryBase<TEntity, TKey> : RepositoryAsyncBase<
6667

6768
#region Constructors
6869

70+
/// <summary>
71+
/// Initializes a new instance of the <see cref="AdoNetRepositoryBase{TEntity, TKey}"/> class.
72+
/// </summary>
73+
/// <param name="connectionString">The connection string.</param>
74+
/// <param name="logger">The logger.</param>
75+
protected AdoNetRepositoryBase(string connectionString, ILogger logger = null) : base(logger)
76+
{
77+
if (string.IsNullOrEmpty(connectionString))
78+
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmptyString, nameof(connectionString));
79+
80+
var ccs = ConfigurationManager.ConnectionStrings[connectionString];
81+
if (ccs == null)
82+
throw new ArgumentException(Resources.ConnectionStringDoestNotExistInConfigFile);
83+
84+
Factory = Internal.DbProviderFactories.GetFactory(ccs.ProviderName);
85+
ConnectionString = connectionString;
86+
87+
Initialize();
88+
}
89+
6990
/// <summary>
7091
/// Initializes a new instance of the <see cref="AdoNetRepositoryBase{TEntity, TKey}"/> class.
7192
/// </summary>
@@ -74,6 +95,9 @@ public abstract class AdoNetRepositoryBase<TEntity, TKey> : RepositoryAsyncBase<
7495
/// <param name="logger">The logger.</param>
7596
protected AdoNetRepositoryBase(string providerName, string connectionString, ILogger logger = null) : base(logger)
7697
{
98+
if (string.IsNullOrEmpty(providerName))
99+
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmptyString, nameof(providerName));
100+
77101
if (string.IsNullOrEmpty(connectionString))
78102
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmptyString, nameof(connectionString));
79103

@@ -1686,7 +1710,7 @@ private TEntity AutoMap(DbDataReader r, DbSqlSelectStatementConfig config)
16861710

16871711
#endregion
16881712

1689-
#region Overrides of RepositoryBase<TEntity,TKey>
1713+
#region Overrides of RepositoryBase<TEntity, TKey>
16901714

16911715
/// <summary>
16921716
/// A protected overridable method for adding the specified <paramref name="entity" /> into the repository.
@@ -1916,7 +1940,7 @@ public override void Dispose()
19161940

19171941
#endregion
19181942

1919-
#region Overrides of RepositoryAsyncBase<TEntity,TKey>
1943+
#region Overrides of RepositoryAsyncBase<TEntity, TKey>
19201944

19211945
/// <summary>
19221946
/// A protected asynchronous overridable method for saving changes made in the current unit of work in the repository.

src/DotNetToolkit.Repository.AdoNet/AdoNetRepositoryFactory.cs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,38 @@ public AdoNetRepositoryFactory(IRepositoryFactoryOptions options)
3838

3939
#region Private Methods
4040

41-
private Tuple<string, string> GetProviderAndConnectionString(IRepositoryFactoryOptions options)
41+
private void GetProviderAndConnectionString(IRepositoryFactoryOptions options, out string providerName, out string connectionString)
4242
{
4343
if (options == null)
4444
throw new ArgumentNullException(nameof(options));
4545

46-
var arg1 = options.DbContextArgs[0];
47-
var provider = arg1 as string;
46+
if (options.DbContextArgs == null || options.DbContextArgs.Length == 0)
47+
throw new InvalidOperationException($"The repository options must provide a '{nameof(options.DbContextArgs)}'.");
4848

49-
if (arg1 != null && provider == null)
50-
throw new ArgumentException($"The provided {nameof(options.DbContextArgs)} must be a valid string argument.");
49+
if (options.DbContextArgs.Length == 1)
50+
{
51+
var arg1 = options.DbContextArgs[0];
52+
connectionString = arg1 as string;
5153

52-
var arg2 = options.DbContextArgs[1];
53-
var connectionString = arg1 as string;
54+
if (arg1 != null && connectionString == null)
55+
throw new ArgumentException($"The provided '{nameof(options.DbContextArgs)}' must be a valid string argument to be used as a connection string.");
5456

55-
if (arg2 != null && connectionString == null)
56-
throw new ArgumentException($"The connection string {nameof(options.DbContextArgs)} must be a valid string argument.");
57+
providerName = null;
58+
}
59+
else
60+
{
61+
var arg1 = options.DbContextArgs[0];
62+
providerName = arg1 as string;
5763

58-
return Tuple.Create<string, string>(provider, connectionString);
64+
if (arg1 != null && providerName == null)
65+
throw new ArgumentException($"The provided '{nameof(options.DbContextArgs)}' must be a valid string argument to be used as a provider name.");
66+
67+
var arg2 = options.DbContextArgs[1];
68+
connectionString = arg1 as string;
69+
70+
if (arg2 != null && connectionString == null)
71+
throw new ArgumentException($"The provided '{nameof(options.DbContextArgs)}' must be a valid string argument to be used as a connection string.");
72+
}
5973
}
6074

6175
#endregion
@@ -97,8 +111,11 @@ public IRepository<TEntity, TKey> Create<TEntity, TKey>() where TEntity : class
97111
/// <returns>The new repository.</returns>
98112
public IRepository<TEntity> Create<TEntity>(IRepositoryFactoryOptions options) where TEntity : class
99113
{
100-
var t = GetProviderAndConnectionString(options);
101-
return new AdoNetRepository<TEntity>(t.Item1, t.Item2, options.Logger);
114+
GetProviderAndConnectionString(options, out string providerName, out string connectionString);
115+
116+
return string.IsNullOrEmpty(providerName)
117+
? new AdoNetRepository<TEntity>(connectionString, options.Logger)
118+
: new AdoNetRepository<TEntity>(providerName, connectionString, options.Logger);
102119
}
103120

104121
/// <summary>
@@ -110,8 +127,11 @@ public IRepository<TEntity> Create<TEntity>(IRepositoryFactoryOptions options) w
110127
/// <returns>The new repository.</returns>
111128
public IRepository<TEntity, TKey> Create<TEntity, TKey>(IRepositoryFactoryOptions options) where TEntity : class
112129
{
113-
var t = GetProviderAndConnectionString(options);
114-
return new AdoNetRepository<TEntity, TKey>(t.Item1, t.Item2, options.Logger);
130+
GetProviderAndConnectionString(options, out string providerName, out string connectionString);
131+
132+
return string.IsNullOrEmpty(providerName)
133+
? new AdoNetRepository<TEntity, TKey>(connectionString, options.Logger)
134+
: new AdoNetRepository<TEntity, TKey>(providerName, connectionString, options.Logger);
115135
}
116136

117137
#endregion

src/DotNetToolkit.Repository.AdoNet/DotNetToolkit.Repository.AdoNet.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
13+
<PackageReference Include="System.Configuration.ConfigurationManager">
14+
<Version>4.5.0-rc1</Version>
15+
</PackageReference>
1316
<PackageReference Include="System.Data.SqlClient" Version="4.4.3" />
1417
</ItemGroup>
1518

@@ -29,6 +32,10 @@
2932
<ProjectReference Include="..\DotNetToolkit.Repository\DotNetToolkit.Repository.csproj" />
3033
</ItemGroup>
3134

35+
<ItemGroup Condition="'$(TargetFramework)' == 'net451'">
36+
<Reference Include="System.Configuration" />
37+
</ItemGroup>
38+
3239
<ItemGroup>
3340
<Compile Update="Properties\Resources.Designer.cs">
3441
<DesignTime>True</DesignTime>

src/DotNetToolkit.Repository.AdoNet/Properties/Resources.Designer.cs

Lines changed: 13 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/DotNetToolkit.Repository.AdoNet/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,7 @@
129129
<data name="InvalidColumnName" xml:space="preserve">
130130
<value>The column name {0} is not valid.</value>
131131
</data>
132+
<data name="ConnectionStringDoestNotExistInConfigFile" xml:space="preserve">
133+
<value>The connection string does not exist in your configuration file.</value>
134+
</data>
132135
</root>

src/DotNetToolkit.Repository.Csv/CsvRepository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ public class CsvRepository<TEntity, TKey> : CsvRepositoryBase<TEntity, TKey> whe
1010
#region Constructors
1111

1212
/// <summary>
13-
/// Initializes a new instance of the <see cref="CsvRepository{TEntity,TKey}"/> class.
13+
/// Initializes a new instance of the <see cref="CsvRepository{TEntity, TKey}"/> class.
1414
/// </summary>
1515
/// <param name="filePath">The file path.</param>
1616
public CsvRepository(string filePath) : base(filePath)
1717
{
1818
}
1919

2020
/// <summary>
21-
/// Initializes a new instance of the <see cref="CsvRepository{TEntity}"/> class.
21+
/// Initializes a new instance of the <see cref="CsvRepository{TEntity, TKey}"/> class.
2222
/// </summary>
2323
/// <param name="filePath">The file path.</param>
2424
/// <param name="logger">The logger.</param>

src/DotNetToolkit.Repository.Csv/CsvRepositoryBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected CsvRepositoryBase(string filePath, ILogger logger) : base(filePath, lo
3232

3333
#endregion
3434

35-
#region Overrides of InMemoryRepositoryFileBase<TEntity,TKey>
35+
#region Overrides of InMemoryRepositoryFileBase<TEntity, TKey>
3636

3737
/// <summary>
3838
/// Gets the file extension.

src/DotNetToolkit.Repository.Csv/CsvRepositoryFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private string GetFilePath(IRepositoryFactoryOptions options)
4848
var databaseName = arg as string;
4949

5050
if (arg != null && databaseName == null)
51-
throw new ArgumentException($"The provided {nameof(options.DbContextArgs)} must be a valid string argument.");
51+
throw new ArgumentException($"The provided '{nameof(options.DbContextArgs)}' must be a valid string argument.");
5252

5353
return databaseName;
5454
}

src/DotNetToolkit.Repository.EntityFramework/EfRepository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class EfRepository<TEntity> : EfRepositoryBase<TEntity, int>, IRepository
4040
public EfRepository(DbContext context) : base(context) { }
4141

4242
/// <summary>
43-
/// Initializes a new instance of the <see cref="EfRepository{TEntity, TKey}" /> class.
43+
/// Initializes a new instance of the <see cref="EfRepository{TEntity}" /> class.
4444
/// </summary>
4545
/// <param name="context">The database context.</param>
4646
/// <param name="logger">The logger.</param>

0 commit comments

Comments
 (0)