Skip to content

Commit aa27758

Browse files
authored
Merge pull request dotnet-architecture#469 from dotnet-architecture/xamarin-settings
Replaced Plugin.Settings with unit testable SettingsService (mobile app)
2 parents 080818e + 940ddd5 commit aa27758

81 files changed

Lines changed: 1041 additions & 775 deletions

File tree

Some content is hidden

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

src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System.Globalization;
2-
using eShopOnContainers.Core.Helpers;
3-
using eShopOnContainers.Services;
4-
using eShopOnContainers.Core.ViewModels.Base;
5-
using System.Threading.Tasks;
6-
using eShopOnContainers.Core.Models.Location;
1+
using eShopOnContainers.Core.Models.Location;
72
using eShopOnContainers.Core.Services.Location;
3+
using eShopOnContainers.Core.Services.Settings;
4+
using eShopOnContainers.Core.ViewModels.Base;
5+
using eShopOnContainers.Services;
86
using Plugin.Geolocator;
7+
using System.Globalization;
8+
using System.Threading.Tasks;
99
using Xamarin.Forms;
1010
using Xamarin.Forms.Xaml;
1111

@@ -14,6 +14,8 @@ namespace eShopOnContainers
1414
{
1515
public partial class App : Application
1616
{
17+
ISettingsService _settingsService;
18+
1719
public App()
1820
{
1921
InitializeComponent();
@@ -27,9 +29,9 @@ public App()
2729

2830
private void InitApp()
2931
{
30-
bool useMockServices = Settings.UseMocks;
31-
if (!useMockServices)
32-
ViewModelLocator.UpdateDependencies(useMockServices);
32+
_settingsService = ViewModelLocator.Resolve<ISettingsService>();
33+
if (!_settingsService.UseMocks)
34+
ViewModelLocator.UpdateDependencies(_settingsService.UseMocks);
3335
}
3436

3537
private Task InitNavigation()
@@ -47,12 +49,12 @@ protected override async void OnStart()
4749
await InitNavigation();
4850
}
4951

50-
if (Settings.AllowGpsLocation && !Settings.UseFakeLocation)
52+
if (_settingsService.AllowGpsLocation && !_settingsService.UseFakeLocation)
5153
{
5254
await GetGpsLocation();
5355
}
5456

55-
if (!Settings.UseMocks && !string.IsNullOrEmpty(Settings.AuthAccessToken))
57+
if (!_settingsService.UseMocks && !string.IsNullOrEmpty(_settingsService.AuthAccessToken))
5658
{
5759
await SendCurrentLocation();
5860
}
@@ -76,26 +78,25 @@ private async Task GetGpsLocation()
7678

7779
var position = await locator.GetPositionAsync();
7880

79-
Settings.Latitude = position.Latitude.ToString();
80-
Settings.Longitude = position.Longitude.ToString();
81+
_settingsService.Latitude = position.Latitude.ToString();
82+
_settingsService.Longitude = position.Longitude.ToString();
8183
}
8284
else
8385
{
84-
Settings.AllowGpsLocation = false;
86+
_settingsService.AllowGpsLocation = false;
8587
}
8688
}
8789

8890
private async Task SendCurrentLocation()
8991
{
9092
var location = new Location
9193
{
92-
Latitude = double.Parse(Settings.Latitude, CultureInfo.InvariantCulture),
93-
Longitude = double.Parse(Settings.Longitude, CultureInfo.InvariantCulture)
94+
Latitude = double.Parse(_settingsService.Latitude, CultureInfo.InvariantCulture),
95+
Longitude = double.Parse(_settingsService.Longitude, CultureInfo.InvariantCulture)
9496
};
9597

9698
var locationService = ViewModelLocator.Resolve<ILocationService>();
97-
await locationService.UpdateUserLocation(location,
98-
Settings.AuthAccessToken);
99+
await locationService.UpdateUserLocation(location, _settingsService.AuthAccessToken);
99100
}
100101
}
101102
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Behaviors/LineColorBehavior.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using System.Linq;
1+
using eShopOnContainers.Core.Effects;
2+
using System.Linq;
23
using Xamarin.Forms;
3-
using eShopOnContainers.Core.Effects;
44

55
namespace eShopOnContainers.Core.Behaviors
66
{

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/ToggleButton.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
1+
using System.Threading.Tasks;
62
using System.Windows.Input;
73
using Xamarin.Forms;
84

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/Campaign.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
namespace eShopOnContainers.Core.Models.Marketing
2-
{
3-
using System;
1+
using System;
42

3+
namespace eShopOnContainers.Core.Models.Marketing
4+
{
55
public class Campaign
66
{
77
public int Id { get; set; }

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignItem.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
namespace eShopOnContainers.Core.Models.Marketing
2-
{
3-
using System;
1+
using System;
42

3+
namespace eShopOnContainers.Core.Models.Marketing
4+
{
55
public class CampaignItem
66
{
77
public int Id { get; set; }

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignRoot.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
namespace eShopOnContainers.Core.Models.Marketing
2-
{
3-
using System.Collections.Generic;
1+
using System.Collections.Generic;
42

3+
namespace eShopOnContainers.Core.Models.Marketing
4+
{
55
public class CampaignRoot
66
{
77
public int PageIndex { get; set; }

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using System;
1+
using Newtonsoft.Json;
2+
using System;
23
using System.Collections.Generic;
3-
using Newtonsoft.Json;
44

55
namespace eShopOnContainers.Core.Models.Orders
66
{

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@
22
using System.Threading.Tasks;
33
using eShopOnContainers.Core.Services.RequestProvider;
44
using eShopOnContainers.Core.Models.Basket;
5-
using eShopOnContainers.Core.Helpers;
5+
using eShopOnContainers.Core.Services.FixUri;
66

77
namespace eShopOnContainers.Core.Services.Basket
88
{
99
public class BasketService : IBasketService
1010
{
1111
private readonly IRequestProvider _requestProvider;
12+
private readonly IFixUriService _fixUriService;
13+
1214
private const string ApiUrlBase = "api/v1/basket";
1315

14-
public BasketService(IRequestProvider requestProvider)
16+
public BasketService(IRequestProvider requestProvider, IFixUriService fixUriService)
1517
{
1618
_requestProvider = requestProvider;
19+
_fixUriService = fixUriService;
1720
}
1821

1922
public async Task<CustomerBasket> GetBasketAsync(string guidUser, string token)
@@ -28,8 +31,7 @@ public async Task<CustomerBasket> GetBasketAsync(string guidUser, string token)
2831
CustomerBasket basket =
2932
await _requestProvider.GetAsync<CustomerBasket>(uri, token);
3033

31-
ServicesHelper.FixBasketItemPictureUri(basket?.Items);
32-
34+
_fixUriService.FixBasketItemPictureUri(basket?.Items);
3335
return basket;
3436
}
3537

@@ -41,9 +43,7 @@ public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBaske
4143
};
4244

4345
var uri = builder.ToString();
44-
4546
var result = await _requestProvider.PostAsync(uri, customerBasket, token);
46-
4747
return result;
4848
}
4949

@@ -55,7 +55,6 @@ public async Task CheckoutAsync(BasketCheckout basketCheckout, string token)
5555
};
5656

5757
var uri = builder.ToString();
58-
5958
await _requestProvider.PostAsync(uri, basketCheckout, token);
6059
}
6160

@@ -67,7 +66,6 @@ public async Task ClearBasketAsync(string guidUser, string token)
6766
};
6867

6968
var uri = builder.ToString();
70-
7169
await _requestProvider.DeleteAsync(uri, token);
7270
}
7371
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,28 @@
55
using eShopOnContainers.Core.Services.RequestProvider;
66
using eShopOnContainers.Core.Extensions;
77
using System.Collections.Generic;
8-
using eShopOnContainers.Core.Helpers;
8+
using eShopOnContainers.Core.Services.FixUri;
99

1010
namespace eShopOnContainers.Core.Services.Catalog
1111
{
1212
public class CatalogService : ICatalogService
1313
{
1414
private readonly IRequestProvider _requestProvider;
15+
private readonly IFixUriService _fixUriService;
1516

16-
public CatalogService(IRequestProvider requestProvider)
17+
public CatalogService(IRequestProvider requestProvider, IFixUriService fixUriService)
1718
{
1819
_requestProvider = requestProvider;
20+
_fixUriService = fixUriService;
1921
}
2022

2123
public async Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId)
2224
{
2325
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint);
24-
2526
builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId);
26-
2727
string uri = builder.ToString();
2828

29-
CatalogRoot catalog =
30-
await _requestProvider.GetAsync<CatalogRoot>(uri);
29+
CatalogRoot catalog = await _requestProvider.GetAsync<CatalogRoot>(uri);
3130

3231
if (catalog?.Data != null)
3332
return catalog?.Data.ToObservableCollection();
@@ -38,34 +37,27 @@ public async Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBran
3837
public async Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
3938
{
4039
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint);
41-
4240
builder.Path = "api/v1/catalog/items";
43-
4441
string uri = builder.ToString();
4542

46-
CatalogRoot catalog =
47-
await _requestProvider.GetAsync<CatalogRoot>(uri);
43+
CatalogRoot catalog = await _requestProvider.GetAsync<CatalogRoot>(uri);
4844

4945
if (catalog?.Data != null)
5046
{
51-
ServicesHelper.FixCatalogItemPictureUri(catalog?.Data);
52-
47+
_fixUriService.FixCatalogItemPictureUri(catalog?.Data);
5348
return catalog?.Data.ToObservableCollection();
5449
}
5550
else
56-
return new ObservableCollection<CatalogItem>();
51+
return new ObservableCollection<CatalogItem>();
5752
}
5853

5954
public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
6055
{
6156
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint);
62-
6357
builder.Path = "api/v1/catalog/catalogbrands";
64-
6558
string uri = builder.ToString();
6659

67-
IEnumerable<CatalogBrand> brands =
68-
await _requestProvider.GetAsync<IEnumerable<CatalogBrand>>(uri);
60+
IEnumerable<CatalogBrand> brands = await _requestProvider.GetAsync<IEnumerable<CatalogBrand>>(uri);
6961

7062
if (brands != null)
7163
return brands?.ToObservableCollection();
@@ -76,18 +68,15 @@ public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
7668
public async Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
7769
{
7870
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint);
79-
8071
builder.Path = "api/v1/catalog/catalogtypes";
81-
8272
string uri = builder.ToString();
8373

84-
IEnumerable<CatalogType> types =
85-
await _requestProvider.GetAsync<IEnumerable<CatalogType>>(uri);
74+
IEnumerable<CatalogType> types = await _requestProvider.GetAsync<IEnumerable<CatalogType>>(uri);
8675

8776
if (types != null)
8877
return types.ToObservableCollection();
8978
else
90-
return new ObservableCollection<CatalogType>();
79+
return new ObservableCollection<CatalogType>();
9180
}
9281
}
9382
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace eShopOnContainers.Core.Services.Dependency
2+
{
3+
public class DependencyService : IDependencyService
4+
{
5+
public T Get<T>() where T : class
6+
{
7+
return Xamarin.Forms.DependencyService.Get<T>();
8+
}
9+
}
10+
}

0 commit comments

Comments
 (0)