Skip to content

Commit 47bbc72

Browse files
authored
Merge pull request dotnet-architecture#171 from dotnet/xamarin
Xamarin Client: Replaced Unity with Autofac. Fixes dotnet-architecture#147
2 parents 0aea1b2 + e07f76d commit 47bbc72

18 files changed

Lines changed: 78 additions & 262 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ public App()
2727
private void InitApp()
2828
{
2929
UseMockServices = Settings.UseMocks;
30-
ViewModelLocator.Initialize();
31-
ViewModelLocator.UpdateDependencies(UseMockServices);
30+
ViewModelLocator.RegisterDependencies(UseMockServices);
3231
}
3332

3433
private Task InitNavigation()

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using eShopOnContainers.Core.ViewModels.Base;
21
using Plugin.Settings;
32
using Plugin.Settings.Abstractions;
43

@@ -32,7 +31,6 @@ private static ISettings AppSettings
3231

3332
#endregion
3433

35-
3634
public static string AuthAccessToken
3735
{
3836
get
@@ -57,7 +55,6 @@ public static string AuthIdToken
5755
}
5856
}
5957

60-
6158
public static bool UseMocks
6259
{
6360
get
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
using System.Threading.Tasks;
2-
3-
namespace eShopOnContainers.Core.Services.Identity
1+
namespace eShopOnContainers.Core.Services.Identity
42
{
53
public interface IIdentityService
64
{
7-
string CreateAuthorizeRequest();
5+
string CreateAuthorizationRequest();
86
string CreateLogoutRequest(string token);
9-
string DecodeToken(string token);
107
}
118
}
Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
using IdentityModel.Client;
2-
using Newtonsoft.Json.Linq;
32
using System;
43
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Text;
74

85
namespace eShopOnContainers.Core.Services.Identity
96
{
107
public class IdentityService : IIdentityService
118
{
12-
public string CreateAuthorizeRequest()
9+
public string CreateAuthorizationRequest()
1310
{
14-
// Create URI to authorize endpoint
15-
var authorizeRequest =
16-
new AuthorizeRequest(GlobalSetting.Instance.IdentityEndpoint);
11+
// Create URI to authorization endpoint
12+
var authorizeRequest = new AuthorizeRequest(GlobalSetting.Instance.IdentityEndpoint);
1713

1814
// Dictionary with values for the authorize request
1915
var dic = new Dictionary<string, string>();
@@ -29,7 +25,6 @@ public string CreateAuthorizeRequest()
2925
dic.Add("state", currentCSRFToken);
3026

3127
var authorizeUri = authorizeRequest.Create(dic);
32-
3328
return authorizeUri;
3429
}
3530

@@ -45,30 +40,5 @@ public string CreateLogoutRequest(string token)
4540
token,
4641
GlobalSetting.Instance.LogoutCallback);
4742
}
48-
49-
public string DecodeToken(string token)
50-
{
51-
var parts = token.Split('.');
52-
53-
string partToConvert = parts[1];
54-
partToConvert = partToConvert.Replace('-', '+');
55-
partToConvert = partToConvert.Replace('_', '/');
56-
switch (partToConvert.Length % 4)
57-
{
58-
case 0:
59-
break;
60-
case 2:
61-
partToConvert += "==";
62-
break;
63-
case 3:
64-
partToConvert += "=";
65-
break;
66-
}
67-
68-
var partAsBytes = Convert.FromBase64String(partToConvert);
69-
var partAsUTF8String = Encoding.UTF8.GetString(partAsBytes, 0, partAsBytes.Count());
70-
71-
return JObject.Parse(partAsUTF8String).ToString();
72-
}
7343
}
7444
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,8 @@ public interface IRequestProvider
66
{
77
Task<TResult> GetAsync<TResult>(string uri, string token = "");
88

9-
Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "");
10-
119
Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "", string header = "");
1210

13-
Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data, string token = "");
14-
15-
Task<TResult> PutAsync<TResult>(string uri, TResult data, string token = "");
16-
17-
Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data, string token = "");
18-
1911
Task DeleteAsync(string uri, string token = "");
2012
}
2113
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Net;
66
using System.Net.Http;
77
using System.Net.Http.Headers;
8-
using System.Text;
98
using System.Threading.Tasks;
109
using System;
1110

@@ -23,7 +22,6 @@ public RequestProvider()
2322
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
2423
NullValueHandling = NullValueHandling.Ignore
2524
};
26-
2725
_serializerSettings.Converters.Add(new StringEnumConverter());
2826
}
2927

@@ -33,7 +31,6 @@ public async Task<TResult> GetAsync<TResult>(string uri, string token = "")
3331
HttpResponseMessage response = await httpClient.GetAsync(uri);
3432

3533
await HandleResponse(response);
36-
3734
string serialized = await response.Content.ReadAsStringAsync();
3835

3936
TResult result = await Task.Run(() =>
@@ -56,7 +53,6 @@ public async Task<TResult> PostAsync<TResult>(string uri, TResult data, string t
5653
HttpResponseMessage response = await httpClient.PostAsync(uri, content);
5754

5855
await HandleResponse(response);
59-
6056
string serialized = await response.Content.ReadAsStringAsync();
6157

6258
TResult result = await Task.Run(() =>
@@ -65,61 +61,21 @@ public async Task<TResult> PostAsync<TResult>(string uri, TResult data, string t
6561
return result;
6662
}
6763

68-
public Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "")
69-
{
70-
return PostAsync<TResult, TResult>(uri, data, token);
71-
}
72-
73-
public async Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data, string token = "")
74-
{
75-
HttpClient httpClient = CreateHttpClient(token);
76-
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
77-
var content = new StringContent(serialized, Encoding.UTF8, "application/json");
78-
HttpResponseMessage response = await httpClient.PostAsync(uri, content);
79-
80-
await HandleResponse(response);
81-
82-
string responseData = await response.Content.ReadAsStringAsync();
83-
84-
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings));
85-
}
86-
87-
public Task<TResult> PutAsync<TResult>(string uri, TResult data, string token = "")
88-
{
89-
return PutAsync<TResult, TResult>(uri, data, token);
90-
}
91-
92-
public async Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data, string token = "")
93-
{
94-
HttpClient httpClient = CreateHttpClient(token);
95-
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
96-
HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"));
97-
98-
await HandleResponse(response);
99-
100-
string responseData = await response.Content.ReadAsStringAsync();
101-
102-
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings));
103-
}
104-
10564
public async Task DeleteAsync(string uri, string token = "")
10665
{
10766
HttpClient httpClient = CreateHttpClient(token);
108-
10967
await httpClient.DeleteAsync(uri);
11068
}
11169

11270
private HttpClient CreateHttpClient(string token = "")
11371
{
11472
var httpClient = new HttpClient();
115-
11673
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
11774

11875
if (!string.IsNullOrEmpty(token))
11976
{
12077
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
12178
}
122-
12379
return httpClient;
12480
}
12581

@@ -140,8 +96,8 @@ private async Task HandleResponse(HttpResponseMessage response)
14096
{
14197
var content = await response.Content.ReadAsStringAsync();
14298

143-
if (response.StatusCode == HttpStatusCode.Forbidden
144-
|| response.StatusCode == HttpStatusCode.Unauthorized)
99+
if (response.StatusCode == HttpStatusCode.Forbidden ||
100+
response.StatusCode == HttpStatusCode.Unauthorized)
145101
{
146102
throw new ServiceAuthenticationException(content);
147103
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs

100644100755
Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Microsoft.Practices.Unity;
1+
using Autofac;
22
using eShopOnContainers.Services;
33
using System;
44
using System.Globalization;
@@ -16,7 +16,7 @@ namespace eShopOnContainers.Core.ViewModels.Base
1616
{
1717
public static class ViewModelLocator
1818
{
19-
private static readonly IUnityContainer _unityContainer = new UnityContainer();
19+
private static IContainer _container;
2020

2121
public static readonly BindableProperty AutoWireViewModelProperty =
2222
BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged);
@@ -33,56 +33,56 @@ public static void SetAutoWireViewModel(BindableObject bindable, bool value)
3333

3434
public static bool UseMockService { get; set; }
3535

36-
public static void Initialize()
36+
public static void RegisterDependencies(bool useMockServices)
3737
{
38-
// Services
39-
_unityContainer.RegisterType<IDialogService, DialogService>();
40-
_unityContainer.RegisterType<INavigationService, NavigationService>(new ContainerControlledLifetimeManager());
41-
_unityContainer.RegisterType<IOpenUrlService, OpenUrlService>();
42-
_unityContainer.RegisterType<IRequestProvider, RequestProvider>();
43-
_unityContainer.RegisterType<IIdentityService, IdentityService>();
44-
_unityContainer.RegisterType<ICatalogService, CatalogMockService>();
45-
_unityContainer.RegisterType<IBasketService, BasketMockService>();
46-
_unityContainer.RegisterType<IUserService, UserMockService>();
38+
var builder = new ContainerBuilder();
4739

4840
// View models
49-
_unityContainer.RegisterType<BasketViewModel>();
50-
_unityContainer.RegisterType<CatalogViewModel>();
51-
_unityContainer.RegisterType<CheckoutViewModel>();
52-
_unityContainer.RegisterType<LoginViewModel>();
53-
_unityContainer.RegisterType<MainViewModel>();
54-
_unityContainer.RegisterType<OrderDetailViewModel>();
55-
_unityContainer.RegisterType<ProfileViewModel>();
56-
_unityContainer.RegisterType<SettingsViewModel>();
57-
}
41+
builder.RegisterType<BasketViewModel>();
42+
builder.RegisterType<CatalogViewModel>();
43+
builder.RegisterType<CheckoutViewModel>();
44+
builder.RegisterType<LoginViewModel>();
45+
builder.RegisterType<MainViewModel>();
46+
builder.RegisterType<OrderDetailViewModel>();
47+
builder.RegisterType<ProfileViewModel>();
48+
builder.RegisterType<SettingsViewModel>();
49+
50+
// Services
51+
builder.RegisterType<NavigationService>().As<INavigationService>().SingleInstance();
52+
builder.RegisterType<DialogService>().As<IDialogService>();
53+
builder.RegisterType<OpenUrlService>().As<IOpenUrlService>();
54+
builder.RegisterType<IdentityService>().As<IIdentityService>();
55+
builder.RegisterType<RequestProvider>().As<IRequestProvider>();
5856

59-
public static void UpdateDependencies(bool useMockServices)
60-
{
61-
// Change injected dependencies
6257
if (useMockServices)
6358
{
64-
_unityContainer.RegisterInstance<ICatalogService>(new CatalogMockService());
65-
_unityContainer.RegisterInstance<IBasketService>(new BasketMockService());
66-
_unityContainer.RegisterInstance<IOrderService>(new OrderMockService());
67-
_unityContainer.RegisterInstance<IUserService>(new UserMockService());
59+
builder.RegisterInstance(new CatalogMockService()).As<ICatalogService>();
60+
builder.RegisterInstance(new BasketMockService()).As<IBasketService>();
61+
builder.RegisterInstance(new OrderMockService()).As<IOrderService>();
62+
builder.RegisterInstance(new UserMockService()).As<IUserService>();
6863

6964
UseMockService = true;
7065
}
7166
else
7267
{
73-
var requestProvider = Resolve<IRequestProvider>();
74-
_unityContainer.RegisterInstance<ICatalogService>(new CatalogService(requestProvider));
75-
_unityContainer.RegisterInstance<IBasketService>(new BasketService(requestProvider));
76-
_unityContainer.RegisterInstance<IOrderService>(new OrderService(requestProvider));
77-
_unityContainer.RegisterInstance<IUserService>(new UserService(requestProvider));
68+
builder.RegisterType<CatalogService>().As<ICatalogService>().SingleInstance();
69+
builder.RegisterType<BasketService>().As<IBasketService>().SingleInstance();
70+
builder.RegisterType<OrderService>().As<IOrderService>().SingleInstance();
71+
builder.RegisterType<UserService>().As<IUserService>().SingleInstance();
7872

7973
UseMockService = false;
8074
}
75+
76+
if (_container != null)
77+
{
78+
_container.Dispose();
79+
}
80+
_container = builder.Build();
8181
}
8282

8383
public static T Resolve<T>()
8484
{
85-
return _unityContainer.Resolve<T>();
85+
return _container.Resolve<T>();
8686
}
8787

8888
private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue)
@@ -103,7 +103,7 @@ private static void OnAutoWireViewModelChanged(BindableObject bindable, object o
103103
{
104104
return;
105105
}
106-
var viewModel = _unityContainer.Resolve(viewModelType);
106+
var viewModel = _container.Resolve(viewModelType);
107107
view.BindingContext = viewModel;
108108
}
109109
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private async Task SignInAsync()
188188

189189
await Task.Delay(500);
190190

191-
LoginUrl = _identityService.CreateAuthorizeRequest();
191+
LoginUrl = _identityService.CreateAuthorizationRequest();
192192

193193
IsValid = true;
194194
IsLogin = true;
@@ -228,7 +228,7 @@ private async Task NavigateAsync(string url)
228228
Settings.AuthAccessToken = string.Empty;
229229
Settings.AuthIdToken = string.Empty;
230230
IsLogin = false;
231-
LoginUrl = _identityService.CreateAuthorizeRequest();
231+
LoginUrl = _identityService.CreateAuthorizationRequest();
232232
}
233233
else if (unescapedUrl.Contains(GlobalSetting.Instance.IdentityCallback))
234234
{

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
using System.Threading.Tasks;
22
using eShopOnContainers.Core.Models.Orders;
33
using eShopOnContainers.Core.ViewModels.Base;
4-
using eShopOnContainers.Core.Services.Catalog;
5-
using eShopOnContainers.Core.Services.Basket;
64
using eShopOnContainers.Core.Services.Order;
75
using System;
86
using eShopOnContainers.Core.Helpers;
@@ -11,9 +9,8 @@ namespace eShopOnContainers.Core.ViewModels
119
{
1210
public class OrderDetailViewModel : ViewModelBase
1311
{
14-
private Order _order;
15-
1612
private IOrderService _ordersService;
13+
private Order _order;
1714

1815
public OrderDetailViewModel(IOrderService ordersService)
1916
{

0 commit comments

Comments
 (0)