Skip to content

Commit e3c6f13

Browse files
authored
Merge pull request #13 from Shuttle/v20
V20
2 parents 85cac96 + 57442cb commit e3c6f13

File tree

91 files changed

+2510
-3459
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+2510
-3459
lines changed

README.md

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ The default JSON settings structure is as follows:
6565

6666
# DatabaseContextScope
6767

68-
The `DatabaseContextService` contains a collection of the `DatabaseContext` instances created by `IDatabaseContextFactory`. However, since the `DatabaseContextService` is a singleton the same collection will be used in all thread contexts. This includes not only the same execution context, but also "peered" execution context running in parallel.
68+
The `DatabaseContextService` contains a collection of the `DatabaseContext` instances created by `IDatabaseContextFactory`. However, since the `DatabaseContextService` is a singleton the same collection will be used in all thread contexts. This includes not only the same execution context, but also "peered" execution contexts running in parallel.
6969

70-
To enable an individual execution/thread context-specific collection which also enables async context flow wrap the initial database context creation in a new `DatabaseContextScope()`:
70+
To enable an individual execution/thread context-specific collection, which also enables async context flow, wrap the initial database context creation in a new `DatabaseContextScope()`:
7171

7272
``` c#
7373
using (new DatabaseContextScope())
@@ -82,6 +82,8 @@ In order to access a database we need a database connection. A database connect
8282

8383
The `DatabaseContextFactory` implementation makes use of an `IDbConnectionFactory` implementation which creates a `System.Data.IDbConnection` by using the provider name and connection string, which is obtained from the registered connection name. An `IDbCommandFactory` creates a `System.Data.IDbCommand` by using an `IDbConnection` instance.
8484

85+
If the connection name is ommitted the `DefaultConnectionStringName` option will be used.
86+
8587
``` c#
8688
var databaseContextFactory = provider.GetRequiredService<IDatabaseContextFactory>();
8789

@@ -117,7 +119,7 @@ This method is used to add a parameter to the query. The `IColumn` instance is
117119

118120
## Query
119121

120-
The `Query` represents a `Text` command type:
122+
The `Query` represents a command:
121123

122124
``` c#
123125
public Query(string commandText, CommandType commandType = CommandType.Text)
@@ -142,20 +144,11 @@ namespace Shuttle.Ordering.DataAccess
142144
{
143145
public class OrderColumns
144146
{
145-
public static readonly Column<Guid> Id =
146-
new Column<Guid>("Id", DbType.Guid);
147-
148-
public static readonly Column<string> OrderNumber =
149-
new Column<string>("OrderNumber", DbType.String, 20);
150-
151-
public static readonly Column<string> OrderDate =
152-
new Column<string>("OrderDate", DbType.DateTime);
153-
154-
public static readonly Column<string> CustomerName =
155-
new Column<string>("CustomerName", DbType.String, 65);
156-
157-
public static readonly Column<string> CustomerEMail =
158-
new Column<string>("CustomerEMail", DbType.String); // size omitted
147+
public static readonly Column<Guid> Id = new("Id", DbType.Guid);
148+
public static readonly Column<string> OrderNumber = new("OrderNumber", DbType.String, 20);
149+
public static readonly Column<string> OrderDate = new("OrderDate", DbType.DateTime);
150+
public static readonly Column<string> CustomerName = new("CustomerName", DbType.String, 65);
151+
public static readonly Column<string> CustomerEMail = new("CustomerEMail", DbType.String); // size omitted
159152
}
160153
}
161154
```
@@ -170,11 +163,9 @@ public T Value(DataRow row)
170163

171164
This will return the typed value of the specified column as contained in the passed-in `DataRow`.
172165

173-
# IDatabaseGateway
174-
175-
The `DatabaseGateway` is used to execute `IQuery` instances in order return data from, or make changes to, the underlying data store. If there is no active open `IDatabaseContext` returned by the `DatabaseContextService.Current` an `InvalidOperationException` will be thrown.
166+
# DatabaseContextExtensions
176167

177-
The following sections each describe the methods available in the `IDatabaseGateway` interface.
168+
The following sections each describe the extension methods available on an `IDatabaseContext` instance.
178169

179170
## GetReaderAsync
180171

@@ -185,9 +176,9 @@ Task<IDataReader> GetReaderAsync(IQuery query, CancellationToken cancellationTok
185176
Returns an `IDataReader` instance for the given `query` statement:
186177

187178
``` c#
188-
using (databaseContextFactory.Create("connection-name"))
179+
using (var databaseContext = databaseContextFactory.Create("connection-name"))
189180
{
190-
var reader = await gateway.GetReaderAsync(new Query("select Id, Username from dbo.Member"));
181+
var reader = await databaseContext.GetReaderAsync(new Query("SELECT Id, Username FROM dbo.Member"));
191182
}
192183
```
193184

@@ -200,9 +191,9 @@ Task<int> ExecuteAsync(IQuery query, CancellationToken cancellationToken = defau
200191
Executes the given query and returns the number of rows affected:
201192

202193
``` c#
203-
using (databaseContextFactory.Create("connection-name"))
194+
using (var databaseContext = databaseContextFactory.Create("connection-name"))
204195
{
205-
await gateway.ExecuteAsync(new Query("delete from dbo.Member where Username = 'mr.resistor'"));
196+
await databaseContext.ExecuteAsync(new Query("DELETE FROM dbo.Member WHERE Username = 'mr.resistor'"));
206197
}
207198
```
208199

@@ -217,9 +208,9 @@ Get the scalar value returned by the `select` query. The query shoud return onl
217208
```c#
218209
using (var databaseContext = databaseContextFactory.Create("connection-name"))
219210
{
220-
var username = await gateway.GetScalarAsync<string>(new Query("select Username from dbo.Member where Id = 10"));
211+
var username = await databaseContext.GetScalarAsync<string>(new Query("SELECT Username FROM dbo.Member WHERE Id = 10"));
221212

222-
var id = await gateway.GetScalarAsync<int>(new Query.Create("select Id from dbo.Member where Username = 'mr.resistor'") );
213+
var id = await databaseContext.GetScalarAsync<int>(new Query.Create("SELECT Id FROM dbo.Member WHERE Username = 'mr.resistor'"));
223214
}
224215
```
225216

@@ -232,9 +223,9 @@ Task<DataTable> GetDataTableAsync(IQuery query, CancellationToken cancellationTo
232223
Returns a `DataTable` containing the rows returned for the given `select` query.
233224

234225
``` c#
235-
using (databaseContextFactory.Create("connection-name"))
226+
using (var databaseContext = databaseContextFactory.Create("connection-name"))
236227
{
237-
var table = await gateway.GetDataTableAsync(new Query("select Id, Username from dbo.Member"));
228+
var table = await databaseContext.GetDataTableAsync(new Query("SELECT Id, Username FROM dbo.Member"));
238229
}
239230
```
240231

@@ -247,9 +238,9 @@ Task<IEnumerable<DataRow>> GetRowsAsync(IQuery query, CancellationToken cancella
247238
Returns an enumerable containing the `DataRow` instances returned for a `select` query:
248239

249240
``` c#
250-
using (databaseContextFactory.Create("connection-name"))
241+
using (var databaseContext = databaseContextFactory.Create("connection-name"))
251242
{
252-
var rows = await gateway.GetRowsAsync(new Query("select Id, Username from dbo.Member"));
243+
var rows = await databaseContext.GetRowsAsync(new Query("SELECT Id, Username FROM dbo.Member"));
253244
}
254245
```
255246

@@ -262,9 +253,9 @@ Task<DataRow> GetRowAsync(IQuery query, CancellationToken cancellationToken = de
262253
Returns a single `DataRow` containing the values returned for a `select` statement that returns exactly one row:
263254

264255
``` c#
265-
using (databaseContextFactory.Create("connection-name"))
256+
using (var databaseContext = databaseContextFactory.Create("connection-name"))
266257
{
267-
var row = await gateway.GetRowAsync(new Query("select Id, Username, EMail, DateActivated from dbo.Member where Id = 10") );
258+
var row = await databaseContext.GetRowAsync(new Query("SELECT Id, Username, EMail, DateActivated FROM dbo.Member WHERE Id = 10"));
268259
}
269260
```
270261

@@ -389,8 +380,10 @@ Using a `MappedData` instance we can keep adding the `MappedRow` instances to th
389380
``` c#
390381
public class OrderAssembler : IAssembler<Order>
391382
{
392-
public IEnumerable<Order> Assemble(MappedData data)
383+
public async Task<IEnumerable<Order>> AssembleAsync(MappedData data)
393384
{
385+
await Task.CompletedTask;
386+
394387
var result = new List<Order>();
395388

396389
foreach (var orderRow in data.MappedRows<Order>())

Shuttle.Core.Data.Tests/.scripts/Microsoft.Data.SqlClient/embedded-script.sql

Lines changed: 0 additions & 1 deletion
This file was deleted.

Shuttle.Core.Data.Tests/.scripts/file-script.sql

Lines changed: 0 additions & 1 deletion
This file was deleted.

Shuttle.Core.Data.Tests/AssemblerExtensionsFixture.cs

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Data;
44
using System.Linq;
5+
using System.Threading.Tasks;
56
using NUnit.Framework;
67
using Shuttle.Core.Data.Tests.Fakes;
78

@@ -11,42 +12,37 @@ namespace Shuttle.Core.Data.Tests;
1112
public class AssemblerExtensionsFixture
1213
{
1314
[Test]
14-
public void Should_be_able_to_assemble_item()
15+
public async Task Should_be_able_to_assemble_item_async()
1516
{
1617
var now = DateTime.Now;
17-
var mappedData = new MappedData();
18+
MappedData mappedData = new();
1819

19-
var orderTable = new DataTable();
20+
DataTable orderTable = new();
2021

2122
orderTable.Columns.Add("OrderNumber", typeof(string));
2223
orderTable.Columns.Add("OrderDate", typeof(DateTime));
2324

2425
const string orderNumber = "ON-10";
2526

26-
mappedData.Add(new MappedRow<Order>(orderTable.Rows.Add(orderNumber, now), new Order(orderNumber, now)));
27+
mappedData.Add(new MappedRow<Order>(orderTable.Rows.Add(orderNumber, now), new(orderNumber, now)));
2728

28-
var orderLineTable = new DataTable();
29+
DataTable orderLineTable = new();
2930

3031
orderLineTable.Columns.Add("OrderNumber", typeof(string));
3132
orderLineTable.Columns.Add("ProductId", typeof(string));
3233
orderLineTable.Columns.Add("Quantity", typeof(int));
3334
orderLineTable.Columns.Add("UnitCost", typeof(double));
3435

35-
mappedData.Add(new List<MappedRow<OrderLine>>
36-
{
37-
new(orderLineTable.Rows.Add(orderNumber, "SKU-1", 5, 10), new OrderLine("SKU-1", 5, 10)),
38-
new(orderLineTable.Rows.Add(orderNumber, "SKU-2", 1, 65), new OrderLine("SKU-2", 1, 65)),
39-
new(orderLineTable.Rows.Add(orderNumber, "SKU-3", 10, 10.5), new OrderLine("SKU-3", 10, 10.5))
40-
});
41-
42-
var order = new OrderAssembler().AssembleItem(mappedData);
43-
44-
Assert.AreEqual(orderNumber, order.OrderNumber);
45-
Assert.AreEqual(now, order.OrderDate);
46-
Assert.AreEqual(3, order.Lines.Count());
47-
Assert.AreEqual(50, order.Lines.ElementAt(0).TotalCost());
48-
Assert.AreEqual(65, order.Lines.ElementAt(1).TotalCost());
49-
Assert.AreEqual(105, order.Lines.ElementAt(2).TotalCost());
50-
Assert.AreEqual(220, order.Total());
36+
mappedData.Add(new List<MappedRow<OrderLine>> { new(orderLineTable.Rows.Add(orderNumber, "SKU-1", 5, 10), new("SKU-1", 5, 10)), new(orderLineTable.Rows.Add(orderNumber, "SKU-2", 1, 65), new("SKU-2", 1, 65)), new(orderLineTable.Rows.Add(orderNumber, "SKU-3", 10, 10.5), new("SKU-3", 10, 10.5)) });
37+
38+
var order = (await new OrderAssembler().AssembleAsync(mappedData)).First();
39+
40+
Assert.That(order.OrderNumber, Is.EqualTo(orderNumber));
41+
Assert.That(order.OrderDate, Is.EqualTo(now));
42+
Assert.That(order.Lines.Count(), Is.EqualTo(3));
43+
Assert.That(order.Lines.ElementAt(0).TotalCost(), Is.EqualTo(50));
44+
Assert.That(order.Lines.ElementAt(1).TotalCost(), Is.EqualTo(65));
45+
Assert.That(order.Lines.ElementAt(2).TotalCost(), Is.EqualTo(105));
46+
Assert.That(order.Total(), Is.EqualTo(220));
5147
}
5248
}

0 commit comments

Comments
 (0)