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
|
using Marina.DataAccess.Builders;
using Marina.DataAccess.Schemas;
using Marina.Domain;
using Marina.Domain.Interfaces;
using Marina.Infrastructure.Container;
namespace Marina.DataAccess.DataMappers {
public class RegistrationDataMapper : IRegistrationDataMapper {
public RegistrationDataMapper() : this( Resolve.DependencyFor< IDatabaseGateway >( ) ) {}
public RegistrationDataMapper( IDatabaseGateway gateway ) {
_gateway = gateway;
}
public IRegistration For( long customerId ) {
return Mappers.From( _gateway.LoadRowUsing( Queries.SelectRegistrationFor( customerId ) ) );
}
public void Insert( IRegistration registration, long forCustomerId ) {
using ( IDatabaseTransaction unitOfWork = new DatabaseTransaction( ) ) {
_gateway.Execute( Queries.Insert( registration, forCustomerId ),
Queries.UpdateCustomer( registration, forCustomerId ) );
unitOfWork.Commit( );
}
}
public void Update( IRegistration registration, long forCustomerId ) {
using ( IDatabaseTransaction unitOfWork = new DatabaseTransaction( ) ) {
_gateway.Execute( Queries.UpdateCustomer( registration, forCustomerId ),
Queries.UpdateAuthorization( registration, forCustomerId ) );
unitOfWork.Commit( );
}
}
private readonly IDatabaseGateway _gateway;
private class Queries {
public static IQuery SelectRegistrationFor( long customerId ) {
return DatabaseSelect.From( CustomerTable.TableName )
.AddColumn( CustomerTable.FirstName )
.AddColumn( CustomerTable.LastName )
.AddColumn( CustomerTable.Phone )
.AddColumn( CustomerTable.City )
.AddColumn( AuthorizationTable.UserName )
.AddColumn( AuthorizationTable.Password )
.InnerJoinOn( AuthorizationTable.CustomerID, CustomerTable.CustomerID )
.Where( CustomerTable.CustomerID, customerId.ToString( ) ).Build( );
}
public static IQuery Insert( IRegistration registration, long forCustomerId ) {
return DatabaseInsert.Into( AuthorizationTable.TableName )
.AddValue( AuthorizationTable.CustomerID, forCustomerId.ToString( ) )
.AddValue( AuthorizationTable.UserName, registration.Username( ) )
.AddValue( AuthorizationTable.Password, registration.Password( ) )
.Build( );
}
public static IQuery UpdateCustomer( IRegistration registration, long forCustomerId ) {
return DatabaseUpdate.Where( CustomerTable.CustomerID, forCustomerId )
.Add( CustomerTable.FirstName, registration.FirstName( ) )
.Add( CustomerTable.LastName, registration.LastName( ) )
.Add( CustomerTable.Phone, registration.PhoneNumber( ) )
.Add( CustomerTable.City, registration.City( ) )
.Build( );
}
public static IQuery UpdateAuthorization( IRegistration registration, long forCustomerId ) {
return DatabaseUpdate.Where( AuthorizationTable.CustomerID, forCustomerId )
.Add( AuthorizationTable.UserName, registration.Username( ) )
.Add( AuthorizationTable.Password, registration.Password( ) )
.Build( );
}
}
private class Mappers {
public static IRegistration From( IDatabaseRow row ) {
return new CustomerRegistration(
row.From< string >( AuthorizationTable.UserName ),
row.From< string >( AuthorizationTable.Password ),
row.From< string >( CustomerTable.FirstName ),
row.From< string >( CustomerTable.LastName ),
row.From< string >( CustomerTable.Phone ),
row.From< string >( CustomerTable.City )
);
}
}
}
}
|