@@ -0,0 +1,47 @@
namespace WpfViewModelBasics.Business.FriendEmail.Command
{
using WpfViewModelBasics.Core.Repository.Command;
using WpfViewModelBasics.Core.Entities;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using WpfViewModelBasics.Core.Interfaces.Services.Command;

public class FriendEmailCommandService: IFriendEmailCommandService
{
private readonly ICommandRepository<FriendEmail> _friendEmailCommandRepository;

public FriendEmailCommandService(ICommandRepository<FriendEmail> friendEmailCommandRepository)
{
this._friendEmailCommandRepository = friendEmailCommandRepository;
}

public async Task<FriendEmail> AddFriendEmailAsync(FriendEmail friendEmail)
{
var result = await this._friendEmailCommandRepository.AddAsync(friendEmail);
return result;
}

public async Task<List<FriendEmail>> AddFriendEmailListAsync(List<FriendEmail> friendEmails)
{
var result = await this._friendEmailCommandRepository.AddListAsync(friendEmails);
return result.ToList();
}

public async Task UpdateFriendEmailListAsync(List<FriendEmail> friendEmails)
{
await this._friendEmailCommandRepository.UpdateListAsync(friendEmails);
}

public async Task UpdateFriendEmailAsync(FriendEmail friendEmail)
{
await this._friendEmailCommandRepository.UpdateAsync(friendEmail);
}

public async Task DeleteFriendEmailAsync(FriendEmail friendEmail)
{
await this._friendEmailCommandRepository.DeleteAsync(friendEmail);
}

}
}

This file was deleted.

This file was deleted.

@@ -44,26 +44,13 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Address\DeleteAddressCommandServiceHandler.cs" />
<Compile Include="Address\UpdateAddressCommandServiceHandler.cs" />
<Compile Include="Address\AddressCommandServiceHandler.cs" />
<Compile Include="FriendEmail\Command\DeleteFriendEmailCommandServiceHandler.cs" />
<Compile Include="FriendEmail\Command\AddFriendEmailCommandServiceHandler.cs" />
<Compile Include="FriendEmail\Command\AddFriendEmailListCommandServiceHandler.cs" />
<Compile Include="FriendEmail\Command\UpdateFriendEmailCommandServiceHandler.cs" />
<Compile Include="FriendEmail\Command\UpdateFriendEmailListCommandServiceHandler.cs" />
<Compile Include="Friend\Command\AddFriendCommandServiceHandler.cs" />
<Compile Include="Friend\Command\DeleteFriendCommandServiceHandler.cs" />
<Compile Include="Friend\Command\UpdateFriendCommandServiceHandler.cs" />
<Compile Include="Friend\Query\GetAllFriendsQueryServiceHandler.cs" />
<Compile Include="Friend\Query\GetFriendQueryServiceHandler.cs" />
<Compile Include="Address\AddressCommandService.cs" />
<Compile Include="FriendEmail\Command\FriendEmailCommandService.cs" />
<Compile Include="Friend\Command\FriendCommandService.cs" />
<Compile Include="Friend\Query\FriendQueryService.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WpfViewModelBasics.Core.Requests\WpfViewModelBasics.Core.Requests.csproj">
<Project>{afe65c43-7a69-467b-aa2a-bad43049bd30}</Project>
<Name>WpfViewModelBasics.Core.Requests</Name>
</ProjectReference>
<ProjectReference Include="..\WpfViewModelBasics.Core\WpfViewModelBasics.Core.csproj">
<Project>{82042b1a-b588-450a-b02f-27ca0abcd3af}</Project>
<Name>WpfViewModelBasics.Core</Name>
@@ -14,7 +14,7 @@ public static class BusinessBootstrapper
public static void InitializeBusinessWithAutoac(this ContainerBuilder container)
{
container.InjectMiscWithAutofac();
container.InjectMediatorWithAutofac();
container.InjectBusinessServices();
}
}
}
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using MediatR;
using Microsoft.Practices.Unity;
using WpfViewModelBasics.Business.Friend;
using WpfViewModelBasics.Core.Entities;
using Autofac;
using Autofac.Core;
using Autofac.Features.Variance;
using WpfViewModelBasics.Business.FriendEmail.Command;
using WpfViewModelBasics.Core.Interfaces.Services.Command;
using WpfViewModelBasics.Business.Friend.Command;
using WpfViewModelBasics.Business.Address;
using WpfViewModelBasics.Business.Friend.Query;
using WpfViewModelBasics.Core.Interfaces.Services.Query;

namespace WpfViewModelBasics.Core.Registration.Container
{
public static class BusinessContainer
{
public static void InjectBusinessServices(this ContainerBuilder builder)
{
builder.RegisterType<FriendEmailCommandService>().As<IFriendEmailCommandService>();
builder.RegisterType<FriendCommandService>().As<IFriendCommandService>();
builder.RegisterType<FriendQueryService>().As<IFriendQueryService>();
builder.RegisterType<AddressCommandService>().As<IAddressCommandService>();
}
}
}

This file was deleted.

@@ -74,7 +74,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="BusinessBootstrapper.cs" />
<Compile Include="Container\MediatorContainer.cs" />
<Compile Include="Container\BusinessContainer.cs" />
<Compile Include="Container\MiscContainer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
@@ -91,10 +91,6 @@
<Project>{f0e48fa7-7d8c-4101-8c9a-6a55e4080013}</Project>
<Name>WpfViewModelBasics.Context</Name>
</ProjectReference>
<ProjectReference Include="..\WpfViewModelBasics.Core.Requests\WpfViewModelBasics.Core.Requests.csproj">
<Project>{afe65c43-7a69-467b-aa2a-bad43049bd30}</Project>
<Name>WpfViewModelBasics.Core.Requests</Name>
</ProjectReference>
<ProjectReference Include="..\WpfViewModelBasics.Core\WpfViewModelBasics.Core.csproj">
<Project>{82042B1A-B588-450A-B02F-27CA0ABCD3AF}</Project>
<Name>WpfViewModelBasics.Core</Name>
@@ -0,0 +1,16 @@

namespace WpfViewModelBasics.Core.Interfaces.Services.Command
{
using System.Threading.Tasks;
using WpfViewModelBasics.Core.Entities;
public interface IAddressCommandService
{
Task<Address> AddAddress(Address address);


Task UpdateAddress(Address address);


Task DeleteAddress(Address address);
}
}
@@ -0,0 +1,16 @@
namespace WpfViewModelBasics.Core.Interfaces.Services.Command
{
using System.Threading.Tasks;
using WpfViewModelBasics.Core.Entities;

public interface IFriendCommandService
{
Task<Friend> AddFriend(Friend address);


Task UpdateFriend(Friend address);


Task DeleteFriend(Friend address);
}
}
@@ -0,0 +1,19 @@
namespace WpfViewModelBasics.Core.Interfaces.Services.Command
{
using WpfViewModelBasics.Core.Entities;
using System.Collections.Generic;
using System.Threading.Tasks;

public interface IFriendEmailCommandService
{
Task<FriendEmail> AddFriendEmailAsync(FriendEmail friendEmail);

Task<List<FriendEmail>> AddFriendEmailListAsync(List<FriendEmail> friendEmails);

Task UpdateFriendEmailListAsync(List<FriendEmail> friendEmails);

Task UpdateFriendEmailAsync(FriendEmail friendEmail);

Task DeleteFriendEmailAsync(FriendEmail friendEmail);
}
}
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfViewModelBasics.Core.Entities;

namespace WpfViewModelBasics.Core.Interfaces.Services.Query
{
public interface IFriendQueryService
{
Task<Friend> GetFriendById(int id);

Task<List<Friend>> GetAllFriend();
}
}
@@ -78,6 +78,10 @@
<Compile Include="Extensions\StringExtensions.cs" />
<Compile Include="Initializer\IRepositoryInitializer.cs" />
<Compile Include="Interfaces\IEntity.cs" />
<Compile Include="Interfaces\Services\Command\IFriendCommandService.cs" />
<Compile Include="Interfaces\Services\Command\IAddressCommandService.cs" />
<Compile Include="Interfaces\Services\Command\IFriendEmailCommandService.cs" />
<Compile Include="Interfaces\Services\Query\IFriendQueryService.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Repository\Command\IAddCommandRepository.cs" />
<Compile Include="Repository\Command\ICommandRepository.cs" />
@@ -1,8 +1,6 @@
namespace WpfViewModelBasics.UI.ViewModel
{
using Core.Requests.Requests.BusinessRequest.Friend.Command;
using System.Collections.Generic;
using MediatR;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
@@ -15,24 +13,35 @@
using Wrapper;
using ViewModelMapping.MappingServices;
using ViewModelMapping.ViewModel;
using Core.Requests.Requests.BusinessRequest.Address;
using Core.Requests.Requests.BusinessRequest.Friend.Query;
using Core.Requests.Requests.BusinessRequest.FriendEmail.Command;
using WpfViewModelBasics.Core.Interfaces.Services.Query;
using WpfViewModelBasics.Core.Interfaces.Services.Command;

public class FriendEditViewModel : ViewModelBase, IFriendEditViewModel
{
private readonly IEventAggregator _eventAggregator;
private readonly IAutoMapperService _mapper;
private readonly IMediator _mediator;
private readonly IFriendQueryService _friendQueryService;
private readonly IFriendCommandService _friendCommandService;
private readonly IFriendEmailCommandService _friendEmailCommandService;
private readonly IAddressCommandService _addressCommandService;


private FriendEmailWrapper _selectedEmail;

public FriendEditViewModel(IEventAggregator eventAggregator,
IAutoMapperService mapper,
IMediator mediator)
IAutoMapperService mapper,
IFriendQueryService friendQueryService,
IFriendCommandService friendCommandService,
IFriendEmailCommandService friendEmailCommandService,
IAddressCommandService addressCommandService)
{
_eventAggregator = eventAggregator;
_mapper = mapper;
_mediator = mediator;
this._eventAggregator = eventAggregator;
this._mapper = mapper;
this._friendQueryService = friendQueryService;
this._friendCommandService = friendCommandService;
this._friendEmailCommandService = friendEmailCommandService;
this._addressCommandService = addressCommandService;

DeleteFriendCommand = new AsyncDelegateCommand(async a => await OnDeleteFriendExecute(a));
SaveFriendCommand = new AsyncDelegateCommand(async a => await OnSaveExecute(a));
RemoveFriendEmailCommand = new DelegateCommand(OnRemoveFriendEmail);
@@ -42,9 +51,15 @@ public class FriendEditViewModel : ViewModelBase, IFriendEditViewModel

public async Task Load(int? friendId = null)
{
var friendEntity = friendId != null ?
await this._mediator.SendAsync(new GetFriendRequest {FriendId = friendId.Value}) :
new Friend { Emails = new List<FriendEmail>(), Address = new Address() };
Friend friendEntity;
if (friendId != null)
{
friendEntity = await this._friendQueryService.GetFriendById(friendId.Value);
}
else
{
friendEntity = new Friend { Emails = new List<FriendEmail>(), Address = new Address() };
}

var friend = _mapper.MapTo<Friend, FriendVm>(friendEntity);
Friend = new FriendWrapper(friend);
@@ -73,7 +88,7 @@ public FriendEmailWrapper SelectedFriendEmail
private async Task OnDeleteFriendExecute(object obj)
{
var friendEntity = this._mapper.MapTo<FriendVm, Friend>(Friend.Model);
await this._mediator.SendAsync(new DeleteFriendRequest { Friend = friendEntity });
await this._friendCommandService.DeleteFriend(friendEntity);
_eventAggregator.GetEvent<DeleteFriendEvent>().Publish(friendEntity.Id);
}

@@ -97,40 +112,43 @@ private async Task AddOrUpdateEmails()
{
var addedEmails = this._mapper.MapTo<IEnumerable<FriendEmailVm>, IEnumerable<FriendEmail>>(Friend.Emails.AddedItems.Select(wrapper => wrapper.Model)).ToList();
addedEmails.ForEach(a => a.FriendId = Friend.Id);
addedEmails = await this._mediator.SendAsync(new AddFriendEmailListRequest {FriendEmails = addedEmails});
addedEmails = await this._friendEmailCommandService.AddFriendEmailListAsync(addedEmails);

for (var i = 0; i < Friend.Emails.AddedItems.Count; i++)
{
Friend.Emails.AddedItems[i].Id = addedEmails[i].Id;
}
var modifiedEmails = this._mapper.MapTo<IEnumerable<FriendEmailVm>, IEnumerable<FriendEmail>>(Friend.Emails.ModifiedItems.Select(wrapper => wrapper.Model)).ToList();
await this._mediator.SendAsync(new UpdateFriendEmailListRequest { FriendEmails = modifiedEmails });
await this._friendEmailCommandService.UpdateFriendEmailListAsync(modifiedEmails);
}

private async Task AddOrUpdateAddress()
{
var addressEntity = this._mapper.MapTo<AddressVm, Address>(Friend.Address.Model);
if (addressEntity.Id == 0)
{
addressEntity = await this._mediator.SendAsync(new AddAddressRequest { Address = addressEntity });
addressEntity = await this._addressCommandService.AddAddress(addressEntity);
}
else
{
await this._mediator.SendAsync(new UpdateAddressRequest { Address = addressEntity });
await this._addressCommandService.UpdateAddress(addressEntity);
}
Friend.Address.Id = addressEntity.Id;
}
private async Task AddOrUpdateFriend()
{
var friendEntity = this._mapper.MapTo<FriendVm, Friend>(Friend.Model);
friendEntity.Emails = null;

if (friendEntity.Id == 0)
{
friendEntity = await this._mediator.SendAsync(new AddFriendRequest {Friend = friendEntity});
friendEntity = await this._friendCommandService.AddFriend(friendEntity);
}
else
{
await this._mediator.SendAsync(new UpdateFriendRequest { Friend = friendEntity });
await this._friendCommandService.UpdateFriend(friendEntity);
}

Friend.Id = friendEntity.Id;
Friend.Address.Id = friendEntity.Address.Id;
}
@@ -6,27 +6,26 @@
using System.Threading.Tasks;
using Base;
using Core.Entities;
using Core.Requests.Requests.BusinessRequest.Friend.Query;
using Events;
using Interfaces;
using MediatR;
using Prism.Events;
using ViewModelMapping.MappingServices;
using ViewModelMapping.ViewModel;
using WpfViewModelBasics.Core.Interfaces.Services.Query;

public class FriendNavigationViewModel : ViewModelBase, IFriendNavigationViewModel
{
private readonly IEventAggregator _eventAggregator;
private readonly IAutoMapperService _mappingService;
private readonly IMediator _mediator;
private readonly IFriendQueryService _friendQueryService;

public FriendNavigationViewModel(IEventAggregator eventAggregator,
IAutoMapperService mappingService,
IMediator mediator)
IFriendQueryService friendQueryService)
{
_eventAggregator = eventAggregator;
_mappingService = mappingService;
_mediator = mediator;
this._eventAggregator = eventAggregator;
this._mappingService = mappingService;
this._friendQueryService = friendQueryService;
NavigationItems = new ObservableCollection<FriendNavigationItemViewModel>();
_eventAggregator.GetEvent<SaveFriendEditViewEvent>().Subscribe(OnFriendSaved);
_eventAggregator.GetEvent<DeleteFriendEvent>().Subscribe(a => RemoveNavigationItem(a));
@@ -41,7 +40,7 @@ public ObservableCollection<FriendNavigationItemViewModel> NavigationItems

public async Task Load()
{
var friendEntities = await _mediator.SendAsync(new GetAllFriendsRequest());
var friendEntities = await this._friendQueryService.GetAllFriend();
var friends = _mappingService.MapTo<IEnumerable<Friend>, IEnumerable<FriendVm>>(friendEntities);
NavigationItems.Clear();
foreach (var friend in friends)
@@ -55,10 +55,6 @@
<HintPath>..\packages\MahApps.Metro.1.4.0\lib\net45\MahApps.Metro.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MediatR, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MediatR.2.1.0\lib\net45\MediatR.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
<Private>True</Private>
@@ -199,10 +195,6 @@
<Project>{c5330ca2-4930-424f-be62-a9afc8f76d96}</Project>
<Name>WpfViewModelBasics.Core.Registration</Name>
</ProjectReference>
<ProjectReference Include="..\WpfViewModelBasics.Core.Requests\WpfViewModelBasics.Core.Requests.csproj">
<Project>{AFE65C43-7A69-467B-AA2A-BAD43049BD30}</Project>
<Name>WpfViewModelBasics.Core.Requests</Name>
</ProjectReference>
<ProjectReference Include="..\WpfViewModelBasics.Core\WpfViewModelBasics.Core.csproj">
<Project>{82042b1a-b588-450a-b02f-27ca0abcd3af}</Project>
<Name>WpfViewModelBasics.Core</Name>
@@ -5,7 +5,6 @@
<package id="CommonServiceLocator" version="1.3" targetFramework="net452" />
<package id="EntityFramework" version="6.1.3" targetFramework="net452" />
<package id="MahApps.Metro" version="1.4.0" targetFramework="net452" />
<package id="MediatR" version="2.1.0" targetFramework="net452" />
<package id="Prism.Core" version="6.2.0" targetFramework="net452" />
<package id="Unity" version="4.0.1" targetFramework="net452" />
</packages>
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
# Visual Studio 15
VisualStudioVersion = 15.0.26228.9
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelBasics.UI", "WpfViewModelBasics.UI\WpfViewModelBasics.UI.csproj", "{B9516ECA-B948-4FF2-B660-7F24FAAE3EF8}"
EndProject
@@ -29,8 +29,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelBasics.Business
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelBasics.ViewModelMapping", "WpfViewModelBasics.ViewModelMapping\WpfViewModelBasics.ViewModelMapping.csproj", "{37B2AC0D-A19F-4488-9D7D-32E0CE935D9F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelBasics.Core.Requests", "WpfViewModelBasics.Core.Requests\WpfViewModelBasics.Core.Requests.csproj", "{AFE65C43-7A69-467B-AA2A-BAD43049BD30}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -69,10 +67,6 @@ Global
{37B2AC0D-A19F-4488-9D7D-32E0CE935D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37B2AC0D-A19F-4488-9D7D-32E0CE935D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{37B2AC0D-A19F-4488-9D7D-32E0CE935D9F}.Release|Any CPU.Build.0 = Release|Any CPU
{AFE65C43-7A69-467B-AA2A-BAD43049BD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFE65C43-7A69-467B-AA2A-BAD43049BD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFE65C43-7A69-467B-AA2A-BAD43049BD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFE65C43-7A69-467B-AA2A-BAD43049BD30}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -86,6 +80,5 @@ Global
{C5330CA2-4930-424F-BE62-A9AFC8F76D96} = {6F24AA98-57C4-4C94-842B-8140154E61F3}
{87B49D73-215B-4C15-A813-009BFB7BFD11} = {BDB9D103-84BE-4709-8AB4-CD5270D30275}
{37B2AC0D-A19F-4488-9D7D-32E0CE935D9F} = {4F350773-09CA-42A0-B0F7-3B5B48DF8816}
{AFE65C43-7A69-467B-AA2A-BAD43049BD30} = {6F24AA98-57C4-4C94-842B-8140154E61F3}
EndGlobalSection
EndGlobal