Merge pull request #567 from dotnet-architecture/xamarin-settings

Simplified SettingsService in Xamarin Client
This commit is contained in:
David Britch 2018-03-29 14:11:11 +01:00 committed by GitHub
commit 94410b433f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
77 changed files with 1006 additions and 1297 deletions

View File

@ -3,7 +3,7 @@
The ARM template `sbusdeploy.json` and its parameter file (`sbusdeploy.parameters.json`) are used to deploy following resources: The ARM template `sbusdeploy.json` and its parameter file (`sbusdeploy.parameters.json`) are used to deploy following resources:
1. One Service Bus namespace 1. One Service Bus namespace
2. One Service Bus 2. One Service Bus topic
3. Subscriptions used by application 3. Subscriptions used by application
## Editing sbusdeploy.parameters.json file ## Editing sbusdeploy.parameters.json file
@ -17,17 +17,8 @@ be set is:
Once parameter file is edited you can deploy it using [create-resources script](../readme.md). Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
i. e. if you are in windows, to deploy sql databases in a new resourcegroup located in westus, go to `deploy\az` folder and type: i. e. if you are in windows, to deploy servicebus in a new resourcegroup located in westus, go to `deploy\az` folder and type:
``` ```
create-resources.cmd servicebus\sbusdeploy newResourceGroup -c westus create-resources.cmd servicebus\sbusdeploy newResourceGroup -c westus
``` ```

View File

@ -24,7 +24,7 @@ Once parameter file is edited you can deploy it using [create-resources script](
i. e. if you are in windows, to deploy a Storage account in a new resourcegroup located in westus, go to `deploy\az` folder and type: i. e. if you are in windows, to deploy a Storage account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
``` ```
create-resources.cmd marketing\deploystorage newResourceGroup -c westus create-resources.cmd storage\marketing\deploystorage newResourceGroup -c westus
``` ```

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
services: services:
sql.data: sql.data:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
services: services:
sql.data: sql.data:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
# The Production docker-compose file has to have the external/real IPs or DNS names for the services # The Production docker-compose file has to have the external/real IPs or DNS names for the services
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like: # The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
services: services:
basket.api: basket.api:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
services: services:
ci-build: ci-build:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
services: services:
basket.api: basket.api:

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
# ONLY NEEDED WHEN RUNNING WINDOWS CONTAINERS # ONLY NEEDED WHEN RUNNING WINDOWS CONTAINERS
# #

View File

@ -1,4 +1,4 @@
version: '3.3' version: '3.4'
# The Production docker-compose file has to have the external/real IPs or DNS names for the services # The Production docker-compose file has to have the external/real IPs or DNS names for the services
# The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like: # The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like:

View File

@ -12,21 +12,21 @@ data:
# Identity.API entries # Identity.API entries
IdentitySqlDb: Identity SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) IdentitySqlDb: Identity SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
# Locations.API entries # Locations.API entries
LocationsBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) LocationsBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
LocationsNoSqlDb: Locations MongoDb ConnectionString LocationsNoSqlDb: Locations MongoDb ConnectionString
LocationsNoSqlDbName: Locations MongoDb database (LocationsDb) LocationsNoSqlDbName: Locations MongoDb database (LocationsDb)
# Marketing.API entries # Marketing.API entries
MarketingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) MarketingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
MarketingNoSqlDb: Marketing MongoDb ConnectionString MarketingNoSqlDb: Marketing MongoDb ConnectionString
MarketingNoSqlDbName: Marketing MongoDb database (MarketingDb) MarketingNoSqlDbName: Marketing MongoDb database (MarketingDb)
MarketingSqlDb: Marketing SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) MarketingSqlDb: Marketing SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
# Ordering.API entries # Ordering.API entries
OrderingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) OrderingBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
OrderingSqlDb: Ordering SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) OrderingSqlDb: Ordering SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....)
GracePeriodManager_GracePeriodTime: "1" GracePeriodManager_GracePeriodTime: "1"
GracePeriodManager_CheckUpdateTime: "15000" GracePeriodManager_CheckUpdateTime: "15000"
# Payment.API entries # Payment.API entries
PaymentBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) PaymentBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX for topic in case of using Azure)
# Global entries # Global entries
all_UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ) all_UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ)
keystore: REDIS CONNECTION STRING FOR KEYSTORE keystore: REDIS CONNECTION STRING FOR KEYSTORE

View File

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -7,9 +7,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="4.6.2" /> <PackageReference Include="Autofac" Version="4.6.2" />
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
<PackageReference Include="Polly" Version="5.6.1" /> <PackageReference Include="Polly" Version="5.8.0" />
<PackageReference Include="RabbitMQ.Client" Version="5.0.1" /> <PackageReference Include="RabbitMQ.Client" Version="5.0.1" />
<PackageReference Include="System.ValueTuple" Version="4.4.0" /> <PackageReference Include="System.ValueTuple" Version="4.4.0" />
</ItemGroup> </ItemGroup>

View File

@ -8,6 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="4.6.2" /> <PackageReference Include="Autofac" Version="4.6.2" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="2.0.0" /> <PackageReference Include="Microsoft.Azure.ServiceBus" Version="2.0.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
</ItemGroup> </ItemGroup>

View File

@ -11,7 +11,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -20,7 +20,7 @@
<PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" /> <PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" />
<PackageReference Include="System.Threading.Thread" Version="4.3.0" /> <PackageReference Include="System.Threading.Thread" Version="4.3.0" />
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.4.0" /> <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.4.0" />
<PackageReference Include="WindowsAzure.Storage" Version="8.7.0" /> <PackageReference Include="WindowsAzure.Storage" Version="9.1.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -10,7 +10,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
<PackageReference Include="System.Diagnostics.Process" Version="4.3.0" /> <PackageReference Include="System.Diagnostics.Process" Version="4.3.0" />
<PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" /> <PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" />
<PackageReference Include="System.Threading.Thread" Version="4.3.0" /> <PackageReference Include="System.Threading.Thread" Version="4.3.0" />

View File

@ -8,8 +8,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
<PackageReference Include="Polly" Version="5.6.1" /> <PackageReference Include="Polly" Version="5.8.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -5,8 +5,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Polly" Version="5.6.1" /> <PackageReference Include="Polly" Version="5.8.0" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -15,7 +15,6 @@ namespace eShopOnContainers.Core.Extensions
} }
return collection; return collection;
} }
} }
} }

View File

@ -1,4 +1,6 @@
namespace eShopOnContainers.Core.Services.Settings using System.Threading.Tasks;
namespace eShopOnContainers.Core.Services.Settings
{ {
public interface ISettingsService public interface ISettingsService
{ {
@ -10,5 +12,10 @@
string Latitude { get; set; } string Latitude { get; set; }
string Longitude { get; set; } string Longitude { get; set; }
bool AllowGpsLocation { get; set; } bool AllowGpsLocation { get; set; }
bool GetValueOrDefault(string key, bool defaultValue);
string GetValueOrDefault(string key, string defaultValue);
Task AddOrUpdateValue(string key, bool value);
Task AddOrUpdateValue(string key, string value);
} }
} }

View File

@ -1,13 +0,0 @@
namespace eShopOnContainers.Core.Services.Settings
{
public interface ISettingsServiceImplementation
{
bool GetValueOrDefault(string key, bool defaultValue);
string GetValueOrDefault(string key, string defaultValue);
bool AddOrUpdateValue(string key, bool value);
bool AddOrUpdateValue(string key, string value);
void Remove(string key);
}
}

View File

@ -1,21 +1,11 @@
using eShopOnContainers.Core.Services.Dependency; using System;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace eShopOnContainers.Core.Services.Settings namespace eShopOnContainers.Core.Services.Settings
{ {
public class SettingsService : ISettingsService public class SettingsService : ISettingsService
{ {
private readonly ISettingsServiceImplementation _settingsService;
ISettingsServiceImplementation AppSettings
{
get { return _settingsService; }
}
public SettingsService(IDependencyService dependencyService)
{
_settingsService = dependencyService.Get<ISettingsServiceImplementation>();
}
#region Setting Constants #region Setting Constants
private const string AccessToken = "access_token"; private const string AccessToken = "access_token";
@ -37,52 +27,113 @@ namespace eShopOnContainers.Core.Services.Settings
#endregion #endregion
#region Settings Properties
public string AuthAccessToken public string AuthAccessToken
{ {
get => AppSettings.GetValueOrDefault(AccessToken, AccessTokenDefault); get => GetValueOrDefault(AccessToken, AccessTokenDefault);
set => AppSettings.AddOrUpdateValue(AccessToken, value); set => AddOrUpdateValue(AccessToken, value);
} }
public string AuthIdToken public string AuthIdToken
{ {
get => AppSettings.GetValueOrDefault(IdToken, IdTokenDefault); get => GetValueOrDefault(IdToken, IdTokenDefault);
set => AppSettings.AddOrUpdateValue(IdToken, value); set => AddOrUpdateValue(IdToken, value);
} }
public bool UseMocks public bool UseMocks
{ {
get => AppSettings.GetValueOrDefault(IdUseMocks, UseMocksDefault); get => GetValueOrDefault(IdUseMocks, UseMocksDefault);
set => AppSettings.AddOrUpdateValue(IdUseMocks, value); set => AddOrUpdateValue(IdUseMocks, value);
} }
public string UrlBase public string UrlBase
{ {
get => AppSettings.GetValueOrDefault(IdUrlBase, UrlBaseDefault); get => GetValueOrDefault(IdUrlBase, UrlBaseDefault);
set => AppSettings.AddOrUpdateValue(IdUrlBase, value); set => AddOrUpdateValue(IdUrlBase, value);
} }
public bool UseFakeLocation public bool UseFakeLocation
{ {
get => AppSettings.GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault); get => GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault);
set => AppSettings.AddOrUpdateValue(IdUseFakeLocation, value); set => AddOrUpdateValue(IdUseFakeLocation, value);
} }
public string Latitude public string Latitude
{ {
get => AppSettings.GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString()); get => GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString());
set => AppSettings.AddOrUpdateValue(IdLatitude, value); set => AddOrUpdateValue(IdLatitude, value);
} }
public string Longitude public string Longitude
{ {
get => AppSettings.GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString()); get => GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString());
set => AppSettings.AddOrUpdateValue(IdLongitude, value); set => AddOrUpdateValue(IdLongitude, value);
} }
public bool AllowGpsLocation public bool AllowGpsLocation
{ {
get => AppSettings.GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault); get => GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault);
set => AppSettings.AddOrUpdateValue(IdAllowGpsLocation, value); set => AddOrUpdateValue(IdAllowGpsLocation, value);
}
#endregion
#region Public Methods
public Task AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
public Task AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value);
public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
#endregion
#region Internal Implementation
async Task AddOrUpdateValueInternal<T>(string key, T value)
{
if (value == null)
{
await Remove(key);
}
Application.Current.Properties[key] = value;
try
{
await Application.Current.SavePropertiesAsync();
}
catch (Exception ex)
{
Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message);
} }
} }
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{
object value = null;
if (Application.Current.Properties.ContainsKey(key))
{
value = Application.Current.Properties[key];
}
return null != value ? (T)value : defaultValue;
}
async Task Remove(string key)
{
try
{
if (Application.Current.Properties[key] != null)
{
Application.Current.Properties.Remove(key);
await Application.Current.SavePropertiesAsync();
}
}
catch (Exception ex)
{
Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message);
}
}
#endregion
}
} }

View File

@ -32,7 +32,7 @@ namespace eShopOnContainers.Droid.Extensions
{ {
return new DateTimeOffset(Epoch.AddMilliseconds(location.Time)); return new DateTimeOffset(Epoch.AddMilliseconds(location.Time));
} }
catch (Exception e) catch (Exception)
{ {
return new DateTimeOffset(Epoch); return new DateTimeOffset(Epoch);
} }

View File

@ -1,149 +0,0 @@
using Android.App;
using Android.Content;
using Android.Preferences;
using eShopOnContainers.Core.Services.Settings;
using eShopOnContainers.Droid.Services;
using System;
[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))]
namespace eShopOnContainers.Droid.Services
{
public class SettingsServiceImplementation : ISettingsServiceImplementation
{
#region Internal Implementation
readonly object _locker = new object();
ISharedPreferences GetSharedPreference()
{
return PreferenceManager.GetDefaultSharedPreferences(Application.Context);
}
bool AddOrUpdateValueInternal<T>(string key, T value)
{
if (Application.Context == null)
return false;
if (value == null)
{
Remove(key);
return true;
}
var type = typeof(T);
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
type = Nullable.GetUnderlyingType(type);
}
var typeCode = Type.GetTypeCode(type);
lock (_locker)
{
using (var sharedPrefs = GetSharedPreference())
{
using (var editor = sharedPrefs.Edit())
{
switch (typeCode)
{
case TypeCode.Boolean:
editor.PutBoolean(key, Convert.ToBoolean(value));
break;
case TypeCode.String:
editor.PutString(key, Convert.ToString(value));
break;
default:
throw new ArgumentException($"Value of type {typeCode} is not supported.");
}
editor.Commit();
}
}
}
return true;
}
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{
if (Application.Context == null)
return defaultValue;
if (!Contains(key))
return defaultValue;
lock (_locker)
{
using (var sharedPrefs = GetSharedPreference())
{
var type = typeof(T);
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
type = Nullable.GetUnderlyingType(type);
}
object value = null;
var typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Boolean:
value = sharedPrefs.GetBoolean(key, Convert.ToBoolean(defaultValue));
break;
case TypeCode.String:
value = sharedPrefs.GetString(key, Convert.ToString(defaultValue));
break;
default:
throw new ArgumentException($"Value of type {typeCode} is not supported.");
}
return null != value ? (T)value : defaultValue;
}
}
}
bool Contains(string key)
{
if (Application.Context == null)
return false;
lock (_locker)
{
using (var sharedPrefs = GetSharedPreference())
{
if (sharedPrefs == null)
return false;
return sharedPrefs.Contains(key);
}
}
}
#endregion
#region ISettingsServiceImplementation
public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value);
public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public void Remove(string key)
{
if (Application.Context == null)
return;
lock (_locker)
{
using (var sharedPrefs = GetSharedPreference())
{
using (var editor = sharedPrefs.Edit())
{
editor.Remove(key);
editor.Commit();
}
}
}
}
#endregion
}
}

View File

@ -19,7 +19,7 @@
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk> <AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion> <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidSupportedAbis>armeabi,armeabi-v7a,x86</AndroidSupportedAbis> <AndroidSupportedAbis>armeabi,armeabi-v7a,x86</AndroidSupportedAbis>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
@ -211,7 +211,6 @@
<Compile Include="Effects\CircleEffect.cs" /> <Compile Include="Effects\CircleEffect.cs" />
<Compile Include="Effects\BaseContainerEffect.cs" /> <Compile Include="Effects\BaseContainerEffect.cs" />
<Compile Include="Activities\SplashActivity.cs" /> <Compile Include="Activities\SplashActivity.cs" />
<Compile Include="Services\SettingsServiceImplementation.cs" />
<Compile Include="Services\PermissionsService.cs" /> <Compile Include="Services\PermissionsService.cs" />
<Compile Include="Services\LocationServiceImplementation.cs" /> <Compile Include="Services\LocationServiceImplementation.cs" />
<Compile Include="Services\GeolocationSingleListener.cs" /> <Compile Include="Services\GeolocationSingleListener.cs" />

View File

@ -13,6 +13,7 @@
<AssemblyName>eShopOnContainersTestRunneriOS</AssemblyName> <AssemblyName>eShopOnContainersTestRunneriOS</AssemblyName>
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -145,7 +146,6 @@
<Reference Include="xunit.execution.dotnet"> <Reference Include="xunit.execution.dotnet">
<HintPath>..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll</HintPath> <HintPath>..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json"> <Reference Include="Newtonsoft.Json">
<HintPath>..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>

View File

@ -1,65 +1,110 @@
using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Services.Settings;
using System; using System.Collections.Generic;
using System.Threading.Tasks;
namespace eShopOnContainers.UnitTests.Mocks namespace eShopOnContainers.UnitTests.Mocks
{ {
public class MockSettingsService : ISettingsService public class MockSettingsService : ISettingsService
{ {
string _accessTokenDefault = string.Empty; IDictionary<string, object> _settings = new Dictionary<string, object>();
string _idTokenDefault = string.Empty;
bool _useMocksDefault = true; const string AccessToken = "access_token";
string _urlBaseDefault = "https://13.88.8.119"; const string IdToken = "id_token";
bool _useFakeLocationDefault = false; const string IdUseMocks = "use_mocks";
bool _allowGpsLocationDefault = false; const string IdUrlBase = "url_base";
double _fakeLatitudeDefault = 47.604610d; const string IdUseFakeLocation = "use_fake_location";
double _fakeLongitudeDefault = -122.315752d; const string IdLatitude = "latitude";
const string IdLongitude = "longitude";
const string IdAllowGpsLocation = "allow_gps_location";
readonly string AccessTokenDefault = string.Empty;
readonly string IdTokenDefault = string.Empty;
readonly bool UseMocksDefault = true;
readonly bool UseFakeLocationDefault = false;
readonly bool AllowGpsLocationDefault = false;
readonly double FakeLatitudeDefault = 47.604610d;
readonly double FakeLongitudeDefault = -122.315752d;
readonly string UrlBaseDefault = "https://13.88.8.119";
public string AuthAccessToken public string AuthAccessToken
{ {
get { return _accessTokenDefault; } get => GetValueOrDefault(AccessToken, AccessTokenDefault);
set { _accessTokenDefault = value; } set => AddOrUpdateValue(AccessToken, value);
} }
public string AuthIdToken public string AuthIdToken
{ {
get { return _idTokenDefault; } get => GetValueOrDefault(IdToken, IdTokenDefault);
set { _idTokenDefault = value; } set => AddOrUpdateValue(IdToken, value);
} }
public bool UseMocks public bool UseMocks
{ {
get { return _useMocksDefault; } get => GetValueOrDefault(IdUseMocks, UseMocksDefault);
set { _useMocksDefault = value; } set => AddOrUpdateValue(IdUseMocks, value);
} }
public string UrlBase public string UrlBase
{ {
get { return _urlBaseDefault; } get => GetValueOrDefault(IdUrlBase, UrlBaseDefault);
set { _urlBaseDefault = value; } set => AddOrUpdateValue(IdUrlBase, value);
} }
public bool UseFakeLocation public bool UseFakeLocation
{ {
get { return _useFakeLocationDefault; } get => GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault);
set { _useFakeLocationDefault = value; } set => AddOrUpdateValue(IdUseFakeLocation, value);
} }
public string Latitude public string Latitude
{ {
get { return _fakeLatitudeDefault.ToString(); } get => GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString());
set { _fakeLatitudeDefault = Convert.ToDouble(value); } set => AddOrUpdateValue(IdLatitude, value);
} }
public string Longitude public string Longitude
{ {
get { return _fakeLongitudeDefault.ToString(); } get => GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString());
set { _fakeLongitudeDefault = Convert.ToDouble(value); } set => AddOrUpdateValue(IdLongitude, value);
} }
public bool AllowGpsLocation public bool AllowGpsLocation
{ {
get { return _allowGpsLocationDefault; } get => GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault);
set { _allowGpsLocationDefault = value; } set => AddOrUpdateValue(IdAllowGpsLocation, value);
}
public Task AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
public Task AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value);
public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
Task AddOrUpdateValueInternal<T>(string key, T value)
{
if (value == null)
{
Remove(key);
}
_settings[key] = value;
return Task.Delay(10);
}
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{
object value = null;
if (_settings.ContainsKey(key))
{
value = _settings[key];
}
return null != value ? (T)value : defaultValue;
}
void Remove(string key)
{
if (_settings[key] != null)
{
_settings.Remove(key);
}
} }
} }
} }

View File

@ -1,99 +0,0 @@
using eShopOnContainers.Core.Services.Settings;
using eShopOnContainers.Windows.Services;
using Windows.Storage;
[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))]
namespace eShopOnContainers.Windows.Services
{
public class SettingsServiceImplementation : ISettingsServiceImplementation
{
#region Internal Implementation
readonly object _locker = new object();
ApplicationDataContainer GetAppSettings()
{
return ApplicationData.Current.LocalSettings;
}
bool AddOrUpdateValueInternal<T>(string key, T value)
{
bool valueChanged = false;
if (value == null)
{
Remove(key);
return true;
}
lock (_locker)
{
var settings = GetAppSettings();
if (settings.Values.ContainsKey(key))
{
if (settings.Values[key] != (object)value)
{
settings.Values[key] = value;
valueChanged = true;
}
}
else
{
settings.Values[key] = value;
valueChanged = true;
}
}
return valueChanged;
}
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{
object value;
lock (_locker)
{
var settings = GetAppSettings();
if (settings.Values.ContainsKey(key))
{
var tempValue = settings.Values[key];
if (tempValue != null)
value = (T)tempValue;
else
value = defaultValue;
}
else
{
value = defaultValue;
}
}
return null != value ? (T)value : defaultValue;
}
#endregion
#region ISettingsServiceImplementation
public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value);
public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public void Remove(string key)
{
lock (_locker)
{
var settings = GetAppSettings();
if (settings.Values.ContainsKey(key))
{
settings.Values.Remove(key);
}
}
}
#endregion
}
}

View File

@ -123,7 +123,6 @@
<Compile Include="Renderers\CustomTabbedPageRenderer.cs" /> <Compile Include="Renderers\CustomTabbedPageRenderer.cs" />
<Compile Include="Renderers\SlideDownMenuPageRenderer.cs" /> <Compile Include="Renderers\SlideDownMenuPageRenderer.cs" />
<Compile Include="Services\LocationServiceImplementation.cs" /> <Compile Include="Services\LocationServiceImplementation.cs" />
<Compile Include="Services\SettingsServiceImplementation.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AppxManifest Include="Package.appxmanifest"> <AppxManifest Include="Package.appxmanifest">

View File

@ -1,128 +0,0 @@
using eShopOnContainers.Core.Services.Settings;
using eShopOnContainers.iOS.Services;
using Foundation;
using System;
[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))]
namespace eShopOnContainers.iOS.Services
{
public class SettingsServiceImplementation : ISettingsServiceImplementation
{
#region Internal Implementation
readonly object _locker = new object();
NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults;
bool AddOrUpdateValueInternal<T>(string key, T value)
{
if (value == null)
{
Remove(key);
return true;
}
var type = typeof(T);
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
type = Nullable.GetUnderlyingType(type);
}
var typeCode = Type.GetTypeCode(type);
lock (_locker)
{
var defaults = GetUserDefaults();
switch (typeCode)
{
case TypeCode.Boolean:
defaults.SetBool(Convert.ToBoolean(value), key);
break;
case TypeCode.String:
defaults.SetString(Convert.ToString(value), key);
break;
default:
throw new ArgumentException($"Value of type {typeCode} is unsupported.");
}
try
{
defaults.Synchronize();
}
catch (Exception ex)
{
Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message);
}
}
return true;
}
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{
lock (_locker)
{
var defaults = GetUserDefaults();
if (defaults[key] == null)
{
return defaultValue;
}
var type = typeof(T);
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
type = Nullable.GetUnderlyingType(type);
}
object value = null;
var typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Boolean:
value = defaults.BoolForKey(key);
break;
case TypeCode.String:
value = defaults.StringForKey(key);
break;
default:
throw new ArgumentException($"Value of type {typeCode} is unsupported.");
}
return null != value ? (T)value : defaultValue;
}
}
#endregion
#region ISettingsServiceImplementation
public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value);
public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue);
public void Remove(string key)
{
lock (_locker)
{
var defaults = GetUserDefaults();
try
{
if (defaults[key] != null)
{
defaults.RemoveObject(key);
defaults.Synchronize();
}
}
catch (Exception ex)
{
Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message);
}
}
}
#endregion
}
}

View File

@ -15,6 +15,7 @@
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
<SkipValidatePackageReferences>true</SkipValidatePackageReferences> <SkipValidatePackageReferences>true</SkipValidatePackageReferences>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -125,7 +126,6 @@
<BundleResource Include="Resources\menu_campaigns%402x.png" /> <BundleResource Include="Resources\menu_campaigns%402x.png" />
<BundleResource Include="Resources\menu_campaigns%403x.png" /> <BundleResource Include="Resources\menu_campaigns%403x.png" />
<None Include="packages.config" /> <None Include="packages.config" />
<Compile Include="Services\SettingsServiceImplementation.cs" />
<Compile Include="Services\LocationServiceImplementation.cs" /> <Compile Include="Services\LocationServiceImplementation.cs" />
<Compile Include="Services\PermissionsService.cs" /> <Compile Include="Services\PermissionsService.cs" />
<Compile Include="Services\GeolocationSingleUpdateDelegate.cs" /> <Compile Include="Services\GeolocationSingleUpdateDelegate.cs" />
@ -182,7 +182,6 @@
<Reference Include="Plugin.Settings"> <Reference Include="Plugin.Settings">
<HintPath>..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll</HintPath> <HintPath>..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json"> <Reference Include="Newtonsoft.Json">
<HintPath>..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>

View File

@ -13,13 +13,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -30,7 +30,8 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
private async Task UpdatePriceInBasketItems(int productId, decimal newPrice, decimal oldPrice, CustomerBasket basket) private async Task UpdatePriceInBasketItems(int productId, decimal newPrice, decimal oldPrice, CustomerBasket basket)
{ {
var itemsToUpdate = basket?.Items?.Where(x => int.Parse(x.ProductId) == productId).ToList(); string match = productId.ToString();
var itemsToUpdate = basket?.Items?.Where(x => x.ProductId == match).ToList();
if (itemsToUpdate != null) if (itemsToUpdate != null)
{ {

View File

@ -205,7 +205,8 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API
.UseSwaggerUI(c => .UseSwaggerUI(c =>
{ {
c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Basket.API V1"); c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Basket.API V1");
c.ConfigureOAuth2("basketswaggerui", "", "", "Basket Swagger UI"); c.OAuthClientId ("basketswaggerui");
c.OAuthAppName("Basket Swagger UI");
}); });
ConfigureEventBus(app); ConfigureEventBus(app);

View File

@ -34,13 +34,13 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" /> <PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />
</ItemGroup> </ItemGroup>

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -14,16 +14,16 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.0.0" /> <PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.1.0" />
<PackageReference Include="IdentityServer4.EntityFramework" Version="2.1.0" /> <PackageReference Include="IdentityServer4.EntityFramework" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
</ItemGroup> </ItemGroup>
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish"> <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -6,18 +6,18 @@
<UserSecretsId>aspnet-Locations.API-20161122013619</UserSecretsId> <UserSecretsId>aspnet-Locations.API-20161122013619</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="mongocsharpdriver" Version="2.5.0" /> <PackageReference Include="mongocsharpdriver" Version="2.5.0" />
<PackageReference Include="MongoDB.Bson" Version="2.5.0" /> <PackageReference Include="MongoDB.Bson" Version="2.5.0" />
<PackageReference Include="MongoDB.Driver" Version="2.5.0" /> <PackageReference Include="MongoDB.Driver" Version="2.5.0" />
<PackageReference Include="MongoDB.Driver.Core" Version="2.5.0" /> <PackageReference Include="MongoDB.Driver.Core" Version="2.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="2.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" /> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />

View File

@ -176,7 +176,8 @@ namespace Microsoft.eShopOnContainers.Services.Locations.API
.UseSwaggerUI(c => .UseSwaggerUI(c =>
{ {
c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Locations.API V1"); c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Locations.API V1");
c.ConfigureOAuth2("locationsswaggerui", "", "", "Locations Swagger UI"); c.OAuthClientId("locationsswaggerui");
c.OAuthAppName("Locations Swagger UI");
}); });
LocationsContextSeed.SeedAsync(app, loggerFactory) LocationsContextSeed.SeedAsync(app, loggerFactory)

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -20,17 +20,17 @@
<Folder Include="Infrastructure\MarketingMigrations\" /> <Folder Include="Infrastructure\MarketingMigrations\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="mongocsharpdriver" Version="2.5.0" /> <PackageReference Include="mongocsharpdriver" Version="2.5.0" />
<PackageReference Include="MongoDB.Bson" Version="2.5.0" /> <PackageReference Include="MongoDB.Bson" Version="2.5.0" />
<PackageReference Include="MongoDB.Driver" Version="2.5.0" /> <PackageReference Include="MongoDB.Driver" Version="2.5.0" />
<PackageReference Include="MongoDB.Driver.Core" Version="2.5.0" /> <PackageReference Include="MongoDB.Driver.Core" Version="2.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" /> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />

View File

@ -208,7 +208,8 @@
.UseSwaggerUI(c => .UseSwaggerUI(c =>
{ {
c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Marketing.API V1"); c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Marketing.API V1");
c.ConfigureOAuth2("marketingswaggerui", "", "", "Marketing Swagger UI"); c.OAuthClientId("marketingswaggerui");
c.OAuthAppName("Marketing Swagger UI");
}); });
ConfigureEventBus(app); ConfigureEventBus(app);

View File

@ -48,12 +48,17 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
else else
{ {
await _requestManager.CreateRequestForCommandAsync<T>(message.Id); await _requestManager.CreateRequestForCommandAsync<T>(message.Id);
try
{
// Send the embeded business command to mediator so it runs its related CommandHandler // Send the embeded business command to mediator so it runs its related CommandHandler
var result = await _mediator.Send(message.Command); var result = await _mediator.Send(message.Command);
return result; return result;
} }
catch
{
return default(R);
}
}
} }
} }
} }

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -30,20 +30,20 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentValidation.AspNetCore" Version="7.3.4" /> <PackageReference Include="FluentValidation.AspNetCore" Version="7.5.0" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="4.0.0" /> <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="4.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="MediatR" Version="4.0.1" /> <PackageReference Include="MediatR" Version="4.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.2.0" />
<PackageReference Include="System.Reflection" Version="4.3.0" /> <PackageReference Include="System.Reflection" Version="4.3.0" />
<PackageReference Include="Dapper" Version="1.50.4" /> <PackageReference Include="Dapper" Version="1.50.4" />
<PackageReference Include="System.ValueTuple" Version="4.4.0" /> <PackageReference Include="System.ValueTuple" Version="4.4.0" />
<PackageReference Include="Polly" Version="5.6.1" /> <PackageReference Include="Polly" Version="5.8.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -226,7 +226,8 @@
.UseSwaggerUI(c => .UseSwaggerUI(c =>
{ {
c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Ordering.API V1"); c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Ordering.API V1");
c.ConfigureOAuth2("orderingswaggerui", "", "", "Ordering Swagger UI"); c.OAuthClientId("orderingswaggerui");
c.OAuthAppName("Ordering Swagger UI");
}); });
ConfigureEventBus(app); ConfigureEventBus(app);

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -11,9 +11,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Dapper" Version="1.50.4" /> <PackageReference Include="Dapper" Version="1.50.4" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -6,11 +6,11 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O
{ {
public class Address : ValueObject public class Address : ValueObject
{ {
public String Street { get; private set; } public String Street { get; }
public String City { get; private set; } public String City { get; }
public String State { get; private set; } public String State { get; }
public String Country { get; private set; } public String Country { get; }
public String ZipCode { get; private set; } public String ZipCode { get; }
private Address() { } private Address() { }

View File

@ -11,13 +11,13 @@ namespace Ordering.Domain.Events
/// </summary> /// </summary>
public class OrderStartedDomainEvent : INotification public class OrderStartedDomainEvent : INotification
{ {
public string UserId { get; private set; } public string UserId { get; }
public int CardTypeId { get; private set; } public int CardTypeId { get; }
public string CardNumber { get; private set; } public string CardNumber { get; }
public string CardSecurityNumber { get; private set; } public string CardSecurityNumber { get; }
public string CardHolderName { get; private set; } public string CardHolderName { get; }
public DateTime CardExpiration { get; private set; } public DateTime CardExpiration { get; }
public Order Order { get; private set; } public Order Order { get; }
public OrderStartedDomainEvent(Order order, string userId, public OrderStartedDomainEvent(Order order, string userId,
int cardTypeId, string cardNumber, int cardTypeId, string cardNumber,

View File

@ -21,17 +21,22 @@
} }
private List<INotification> _domainEvents; private List<INotification> _domainEvents;
public List<INotification> DomainEvents => _domainEvents; public IReadOnlyCollection<INotification> DomainEvents => _domainEvents?.AsReadOnly();
public void AddDomainEvent(INotification eventItem) public void AddDomainEvent(INotification eventItem)
{ {
_domainEvents = _domainEvents ?? new List<INotification>(); _domainEvents = _domainEvents ?? new List<INotification>();
_domainEvents.Add(eventItem); _domainEvents.Add(eventItem);
} }
public void RemoveDomainEvent(INotification eventItem) public void RemoveDomainEvent(INotification eventItem)
{ {
if (_domainEvents is null) return; _domainEvents?.Remove(eventItem);
_domainEvents.Remove(eventItem); }
public void ClearDomainEvents()
{
_domainEvents?.Clear();
} }
public bool IsTransient() public bool IsTransient()

View File

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@ -11,9 +11,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork
public int Id { get; private set; } public int Id { get; private set; }
protected Enumeration() protected Enumeration(){}
{
}
protected Enumeration(int id, string name) protected Enumeration(int id, string name)
{ {
@ -21,10 +19,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork
Name = name; Name = name;
} }
public override string ToString() public override string ToString() => Name;
{
return Name;
}
public static IEnumerable<T> GetAll<T>() where T : Enumeration, new() public static IEnumerable<T> GetAll<T>() where T : Enumeration, new()
{ {
@ -37,20 +32,16 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork
var locatedValue = info.GetValue(instance) as T; var locatedValue = info.GetValue(instance) as T;
if (locatedValue != null) if (locatedValue != null)
{
yield return locatedValue; yield return locatedValue;
} }
} }
}
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
var otherValue = obj as Enumeration; var otherValue = obj as Enumeration;
if (otherValue == null) if (otherValue == null)
{
return false; return false;
}
var typeMatches = GetType().Equals(obj.GetType()); var typeMatches = GetType().Equals(obj.GetType());
var valueMatches = Id.Equals(otherValue.Id); var valueMatches = Id.Equals(otherValue.Id);
@ -58,10 +49,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork
return typeMatches && valueMatches; return typeMatches && valueMatches;
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
{
return Id.GetHashCode();
}
public static int AbsoluteDifference(Enumeration firstValue, Enumeration secondValue) public static int AbsoluteDifference(Enumeration firstValue, Enumeration secondValue)
{ {
@ -86,18 +74,11 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork
var matchingItem = GetAll<T>().FirstOrDefault(predicate); var matchingItem = GetAll<T>().FirstOrDefault(predicate);
if (matchingItem == null) if (matchingItem == null)
{ throw new InvalidOperationException($"'{value}' is not a valid {description} in {typeof(T)}");
var message = string.Format("'{0}' is not a valid {1} in {2}", value, description, typeof(T));
throw new InvalidOperationException(message);
}
return matchingItem; return matchingItem;
} }
public int CompareTo(object other) public int CompareTo(object other) => Id.CompareTo(((Enumeration) other).Id);
{
return Id.CompareTo(((Enumeration)other).Id);
}
} }
} }

View File

@ -19,7 +19,7 @@ namespace Ordering.Infrastructure
.ToList(); .ToList();
domainEntities.ToList() domainEntities.ToList()
.ForEach(entity => entity.Entity.DomainEvents.Clear()); .ForEach(entity => entity.Entity.ClearDomainEvents());
var tasks = domainEvents var tasks = domainEvents
.Select(async (domainEvent) => { .Select(async (domainEvent) => {

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -7,12 +7,12 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" /> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -18,13 +18,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Fabric.MSBuild" Version="1.6.3" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Fabric.MSBuild" Version="1.6.5" />
</ItemGroup> </ItemGroup>
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish"> <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503

View File

@ -27,13 +27,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.Redis" Version="0.3.1" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
</ItemGroup> </ItemGroup>
<!-- workaround for https://github.com/aspnet/websdk/issues/114 --> <!-- workaround for https://github.com/aspnet/websdk/issues/114 -->

View File

@ -1,8 +1,8 @@
FROM microsoft/aspnetcore:2.0.3 AS base FROM microsoft/aspnetcore:2.0.5 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build
WORKDIR /src WORKDIR /src
COPY . . COPY . .
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503
@ -16,3 +16,4 @@ FROM base AS final
WORKDIR /app WORKDIR /app
COPY --from=publish /app . COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebStatus.dll"] ENTRYPOINT ["dotnet", "WebStatus.dll"]

View File

@ -5,11 +5,11 @@
<DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath> <DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" /> <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.4.1" /> <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta3" /> <PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="1.0.0-beta5" />
<PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" /> <PackageReference Include="Microsoft.ApplicationInsights.ServiceFabric" Version="2.0.1-beta1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" /> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />

View File

@ -44,10 +44,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.1" />
<PackageReference Include="xunit" Version="2.3.0" /> <PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -2,8 +2,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework> <TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>FunctionalTests</AssemblyName> <AssemblyName>IntegrationTests</AssemblyName>
<PackageId>FunctionalTests</PackageId> <PackageId>IntegrationTests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
@ -44,13 +44,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
<PackageReference Include="Moq" Version="4.7.142" /> <PackageReference Include="Moq" Version="4.8.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.1" />
<PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" /> <PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" />
<PackageReference Include="xunit" Version="2.3.0" /> <PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="StackExchange.Redis.strongname" Version="1.2.4" /> <PackageReference Include="StackExchange.Redis.strongname" Version="1.2.6" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -58,6 +58,15 @@ namespace IntegrationTests.Services.Basket
string BuildBasket() string BuildBasket()
{ {
var order = new CustomerBasket("1234"); var order = new CustomerBasket("1234");
order.Items.Add(new BasketItem
{
ProductId = "1",
ProductName = ".NET Bot Black Hoodie",
UnitPrice = 10,
Quantity = 1
});
return JsonConvert.SerializeObject(order); return JsonConvert.SerializeObject(order);
} }
@ -70,10 +79,10 @@ namespace IntegrationTests.Services.Basket
State = "state", State = "state",
Country = "coutry", Country = "coutry",
ZipCode = "zipcode", ZipCode = "zipcode",
CardNumber = "CardNumber", CardNumber = "1234567890123456",
CardHolderName = "CardHolderName", CardHolderName = "CardHolderName",
CardExpiration = DateTime.UtcNow, CardExpiration = DateTime.UtcNow.AddDays(1),
CardSecurityNumber = "1234", CardSecurityNumber = "123",
CardTypeId = 1, CardTypeId = 1,
Buyer = "Buyer", Buyer = "Buyer",
RequestId = Guid.NewGuid() RequestId = Guid.NewGuid()

View File

@ -21,12 +21,12 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" /> <PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<PackageReference Include="MediatR" Version="4.0.1" /> <PackageReference Include="MediatR" Version="4.0.1" />
<PackageReference Include="Moq" Version="4.7.142" /> <PackageReference Include="Moq" Version="4.8.1" />
<PackageReference Include="xunit" Version="2.3.0" /> <PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>