Full Code of lizhi5753186/OnlineStore for AI

master e5aa45a51d0f cached
547 files
38.7 MB
10.2M tokens
1287 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (40,760K chars total). Download the full file to get everything.
Repository: lizhi5753186/OnlineStore
Branch: master
Commit: e5aa45a51d0f
Files: 547
Total size: 38.7 MB

Directory structure:
gitextract_wa3viklp/

├── .gitattributes
├── .gitignore
├── .nuget/
│   ├── NuGet.Config
│   └── NuGet.targets
├── OnlineStore.Application/
│   ├── AddressResolver.cs
│   ├── App_Data/
│   │   ├── OnlineStore.mdf
│   │   └── OnlineStore_log.ldf
│   ├── ApplicationService.cs
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── InversedAddressResolver.cs
│   ├── Logs/
│   │   └── onlinestore.txt
│   ├── OnlineStore.Application.csproj
│   ├── OrderService.svc
│   ├── OrderService.svc.cs
│   ├── ProductService.svc
│   ├── ProductService.svc.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ServiceImplementations/
│   │   ├── OrderServiceImp.cs
│   │   ├── ProductServiceImp.cs
│   │   └── UserServiceImp.cs
│   ├── UserService.svc
│   ├── UserService.svc.cs
│   ├── Web.Debug.config
│   ├── Web.Release.config
│   ├── Web.config
│   └── packages.config
├── OnlineStore.Domain/
│   ├── DomainException.cs
│   ├── Events/
│   │   ├── DomainEvent.cs
│   │   ├── EventHandlers/
│   │   │   ├── OrderConfirmedEventHandler.cs
│   │   │   └── OrderDispatchedEventHandler.cs
│   │   ├── IDomainEvent.cs
│   │   ├── IDomainEventHandler.cs
│   │   ├── OrderConfirmedEvent.cs
│   │   └── OrderDispatchedEvent.cs
│   ├── IAggregateRoot.cs
│   ├── IEntity.cs
│   ├── Model/
│   │   ├── Address.cs
│   │   ├── AggregateRoot.cs
│   │   ├── Category.cs
│   │   ├── Order.cs
│   │   ├── OrderItem.cs
│   │   ├── OrderStatus.cs
│   │   ├── Product.cs
│   │   ├── ProductCategorization.cs
│   │   ├── Role.cs
│   │   ├── ShoppingCart.cs
│   │   ├── ShoppingCartItem.cs
│   │   ├── User.cs
│   │   └── UserRole.cs
│   ├── OnlineStore.Domain.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Repositories/
│   │   ├── ICategoryRepository.cs
│   │   ├── IOrderRepository.cs
│   │   ├── IProductCategorizationRepository.cs
│   │   ├── IProductRepository.cs
│   │   ├── IRepository.cs
│   │   ├── IRepositoryContext.cs
│   │   ├── IRoleRepository.cs
│   │   ├── IShoppingCartItemRepository.cs
│   │   ├── IShoppingCartRepository.cs
│   │   ├── IUserRepository.cs
│   │   ├── IUserRoleRepository.cs
│   │   └── SortOrder.cs
│   ├── Services/
│   │   ├── DomainService.cs
│   │   └── IDomainService.cs
│   ├── Specifications/
│   │   ├── AnySpecification.cs
│   │   ├── ExpressionSpecification.cs
│   │   ├── ISpecification.cs
│   │   ├── ParameterReplacer.cs
│   │   ├── SpecExprExtensions.cs
│   │   └── Specification.cs
│   └── app.config
├── OnlineStore.Events/
│   ├── Bus/
│   │   ├── EventBus.cs
│   │   ├── IBus.cs
│   │   ├── IEventBus.cs
│   │   ├── MsmqBusOptions.cs
│   │   └── MsmqEventBus.cs
│   ├── EventAggregator.cs
│   ├── HandlesAsynchronouslyAttribute.cs
│   ├── IEvent.cs
│   ├── IEventAggregator.cs
│   ├── IEventHandler.cs
│   ├── OnlineStore.Events.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── app.config
├── OnlineStore.Events.Handlers/
│   ├── OnlineStore.Events.Handlers.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── SendEmailHandler.cs
│   └── app.config
├── OnlineStore.Infrastructure/
│   ├── Caching/
│   │   ├── AppfabricCacheProvider.cs
│   │   ├── CacheAttribute.cs
│   │   ├── CachingMethod.cs
│   │   ├── EntLibCacheProvider.cs
│   │   └── ICacheProvider.cs
│   ├── DisposableObject.cs
│   ├── IUnitOfWork.cs
│   ├── InterceptionBehaviors/
│   │   ├── CachingBehavior.cs
│   │   └── ExceptionLoggingBehavior.cs
│   ├── OnlineStore.Infrastructure.csproj
│   ├── PagedResult.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ServiceLocator.cs
│   ├── Utils.cs
│   ├── app.config
│   └── packages.config
├── OnlineStore.ModelDTO/
│   ├── OnlineStore.ModelDTO.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Service References/
│   │   ├── OrderService/
│   │   │   ├── OnlineStore.ModelDTO.OrderService.ShoppingCart.datasource
│   │   │   ├── OrderService.disco
│   │   │   ├── OrderService.wsdl
│   │   │   ├── OrderService.xsd
│   │   │   ├── OrderService1.xsd
│   │   │   ├── OrderService2.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   └── ProductService/
│   │       ├── OnlineStore.ModelDTO.ProductService.Category.datasource
│   │       ├── OnlineStore.ModelDTO.ProductService.Product.datasource
│   │       ├── ProductService.disco
│   │       ├── ProductService.wsdl
│   │       ├── ProductService.xsd
│   │       ├── ProductService1.wsdl
│   │       ├── ProductService1.xsd
│   │       ├── ProductService2.xsd
│   │       ├── Reference.cs
│   │       ├── Reference.svcmap
│   │       ├── configuration.svcinfo
│   │       └── configuration91.svcinfo
│   └── app.config
├── OnlineStore.Repositories/
│   ├── App.config
│   ├── EntityFramework/
│   │   ├── CategoryRepository.cs
│   │   ├── EntityFrameworkRepository.cs
│   │   ├── EntityFrameworkRepositoryContext.cs
│   │   ├── IEntityFrameworkRepositoryContext.cs
│   │   ├── ModelConfigurations/
│   │   │   ├── CategoryTypeConfiguration.cs
│   │   │   ├── OrderItemTypeConfiguration.cs
│   │   │   ├── OrderTypeConfiguration.cs
│   │   │   ├── ProductCategorizationTypeConfiguration.cs
│   │   │   ├── ProductTypeConfiguration.cs
│   │   │   ├── RoleTypeConfiguration.cs
│   │   │   ├── ShoppingCartItemTypeConfiguration.cs
│   │   │   ├── ShoppingCartTypeConfiguration.cs
│   │   │   ├── UserRoleTypeConfiguration.cs
│   │   │   └── UserTypeConfiguration.cs
│   │   ├── OnlineStoreDbContext.cs
│   │   ├── OnlineStoreDbContextInitailizer.cs
│   │   ├── OrderRepository.cs
│   │   ├── ProductCategorizationRepository.cs
│   │   ├── ProductRepository.cs
│   │   ├── RoleRepository.cs
│   │   ├── ShoppingCartItemRepository.cs
│   │   ├── ShoppingCartRepository.cs
│   │   ├── SortByExtension.cs
│   │   ├── UserRepository.cs
│   │   └── UserRoleRepository.cs
│   ├── OnlineStore.Repositories.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── packages.config
├── OnlineStore.ServiceContract/
│   ├── IOrderService.cs
│   ├── IProductService.cs
│   ├── IUserService.cs
│   ├── ModelDTOs/
│   │   ├── AddressDto.cs
│   │   ├── CategoryDto.cs
│   │   ├── FaultData.cs
│   │   ├── OrderDto.cs
│   │   ├── OrderItemDto.cs
│   │   ├── OrderStatusDto.cs
│   │   ├── Pagination.cs
│   │   ├── ProductCategorizationDto.cs
│   │   ├── ProductDto.cs
│   │   ├── ProductDtoWithPagination.cs
│   │   ├── RoleDto.cs
│   │   ├── ShoppingCartDto.cs
│   │   ├── ShoppingCartItemDto.cs
│   │   └── UserDto.cs
│   ├── OnlineStore.ServiceContracts.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── app.config
├── OnlineStore.Web/
│   ├── App_Code/
│   │   ├── HtmlExtension.cs
│   │   ├── PermissionKeys.cs
│   │   └── UrlHelperExtension.cs
│   ├── App_Start/
│   │   ├── AuthConfig.cs
│   │   ├── BundleConfig.cs
│   │   ├── FilterConfig.cs
│   │   ├── RouteConfig.cs
│   │   └── WebApiConfig.cs
│   ├── Content/
│   │   ├── Site.css
│   │   ├── themes/
│   │   │   └── base/
│   │   │       ├── jquery-ui.css
│   │   │       ├── jquery.ui.accordion.css
│   │   │       ├── jquery.ui.all.css
│   │   │       ├── jquery.ui.autocomplete.css
│   │   │       ├── jquery.ui.base.css
│   │   │       ├── jquery.ui.button.css
│   │   │       ├── jquery.ui.core.css
│   │   │       ├── jquery.ui.datepicker.css
│   │   │       ├── jquery.ui.dialog.css
│   │   │       ├── jquery.ui.progressbar.css
│   │   │       ├── jquery.ui.resizable.css
│   │   │       ├── jquery.ui.selectable.css
│   │   │       ├── jquery.ui.slider.css
│   │   │       ├── jquery.ui.tabs.css
│   │   │       └── jquery.ui.theme.css
│   │   ├── uploadify.css
│   │   └── uploadify.swf
│   ├── Controllers/
│   │   ├── AccountController.cs
│   │   ├── AdminController.cs
│   │   ├── ControllerBase.cs
│   │   ├── HomeController.cs
│   │   └── LayoutController.cs
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── Membership/
│   │   ├── OnlineStoreMembershipProvider.cs
│   │   └── OnlineStoreMembershipUser.cs
│   ├── MvcSiteMap.cs
│   ├── OnlineStore.Web.csproj
│   ├── OnlineStore.Web.csproj.DotSettings
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Scripts/
│   │   ├── _references.js
│   │   ├── hoverIntent.js
│   │   ├── jquery-1.7.1.intellisense.js
│   │   ├── jquery-1.7.1.js
│   │   ├── jquery-ui-1.8.20.js
│   │   ├── jquery.unobtrusive-ajax.js
│   │   ├── jquery.uploadify.js
│   │   ├── jquery.validate-vsdoc.js
│   │   ├── jquery.validate.js
│   │   ├── jquery.validate.unobtrusive.js
│   │   ├── knockout-2.1.0.debug.js
│   │   ├── knockout-2.1.0.js
│   │   ├── modernizr-2.5.3.js
│   │   ├── superfish.js
│   │   └── supersubs.js
│   ├── Service References/
│   │   ├── OnlineStoreDto.Partial.cs
│   │   ├── OrderService/
│   │   │   ├── OnlineStore.Web.OrderService.OrderDto.datasource
│   │   │   ├── OnlineStore.Web.OrderService.ShoppingCartDto.datasource
│   │   │   ├── OrderService.disco
│   │   │   ├── OrderService.wsdl
│   │   │   ├── OrderService.xsd
│   │   │   ├── OrderService1.xsd
│   │   │   ├── OrderService2.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   ├── ProductService/
│   │   │   ├── OnlineStore.Web.ProductService.CategoryDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductCategorizationDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductDtoWithPagination.datasource
│   │   │   ├── ProductService.disco
│   │   │   ├── ProductService.wsdl
│   │   │   ├── ProductService.xsd
│   │   │   ├── ProductService1.wsdl
│   │   │   ├── ProductService1.xsd
│   │   │   ├── ProductService2.xsd
│   │   │   ├── ProductService3.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   └── UserService/
│   │       ├── OnlineStore.Web.UserService.OrderDto.datasource
│   │       ├── OnlineStore.Web.UserService.RoleDto.datasource
│   │       ├── OnlineStore.Web.UserService.UserDto.datasource
│   │       ├── Reference.cs
│   │       ├── Reference.svcmap
│   │       ├── UserService.disco
│   │       ├── UserService.wsdl
│   │       ├── UserService.xsd
│   │       ├── UserService1.wsdl
│   │       ├── UserService1.xsd
│   │       ├── UserService2.xsd
│   │       ├── UserService3.xsd
│   │       ├── configuration.svcinfo
│   │       └── configuration91.svcinfo
│   ├── SiteMap.xml
│   ├── ViewModels/
│   │   ├── LoginViewModel.cs
│   │   └── UserAccountModel.cs
│   ├── Views/
│   │   ├── Account/
│   │   │   ├── Login.cshtml
│   │   │   ├── Manage.cshtml
│   │   │   └── Register.cshtml
│   │   ├── Admin/
│   │   │   ├── AddCategory.cshtml
│   │   │   ├── AddProduct.cshtml
│   │   │   ├── AddRole.cshtml
│   │   │   ├── AddUserAccount.cshtml
│   │   │   ├── Administration.cshtml
│   │   │   ├── Categories.cshtml
│   │   │   ├── EditCategory.cshtml
│   │   │   ├── EditProduct.cshtml
│   │   │   ├── EditRole.cshtml
│   │   │   ├── EditUserAccount.cshtml
│   │   │   ├── Order.cshtml
│   │   │   ├── Orders.cshtml
│   │   │   ├── Products.cshtml
│   │   │   ├── Roles.cshtml
│   │   │   └── UserAccounts.cshtml
│   │   ├── Home/
│   │   │   ├── About.cshtml
│   │   │   ├── Category.cshtml
│   │   │   ├── Checkout.cshtml
│   │   │   ├── Contact.cshtml
│   │   │   ├── Index.cshtml
│   │   │   ├── Order.cshtml
│   │   │   ├── Orders.cshtml
│   │   │   ├── ProductDetail.cshtml
│   │   │   ├── ShoppingCart.cshtml
│   │   │   └── SuccessPage.cshtml
│   │   ├── Shared/
│   │   │   ├── CategoriesPartial.cshtml
│   │   │   ├── Error.cshtml
│   │   │   ├── NewProductsPartial.cshtml
│   │   │   ├── ProductsPartial.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _LoginPartial.cshtml
│   │   ├── Web.config
│   │   └── _ViewStart.cshtml
│   ├── Web.Debug.config
│   ├── Web.Release.config
│   ├── Web.config
│   └── packages.config
├── OnlineStore.sln
├── README.md
├── Scripts/
│   ├── dbo.Categories.data.sql
│   ├── dbo.ProductCategorizations.data.sql
│   ├── dbo.Products.data.sql
│   ├── dbo.Roles.sql
│   ├── dbo.UserRoles.data.sql
│   └── dbo.Users.data.sql
└── packages/
    ├── Antlr.3.4.1.9004/
    │   └── Antlr.3.4.1.9004.nupkg
    ├── Antlr.3.5.0.2/
    │   └── Antlr.3.5.0.2.nupkg
    ├── AutoMapper.3.3.1/
    │   ├── AutoMapper.3.3.1.nupkg
    │   ├── lib/
    │   │   ├── MonoAndroid/
    │   │   │   └── AutoMapper.xml
    │   │   ├── MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── net40/
    │   │   │   └── AutoMapper.xml
    │   │   ├── portable-windows8+net40+wp8+sl5+MonoAndroid+MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── portable-windows8+net40+wp8+wpa81+sl5+MonoAndroid+MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── sl5/
    │   │   │   └── AutoMapper.xml
    │   │   ├── windows8/
    │   │   │   └── AutoMapper.xml
    │   │   ├── wp8/
    │   │   │   └── AutoMapper.xml
    │   │   └── wpa81/
    │   │       └── AutoMapper.xml
    │   └── tools/
    │       ├── AutoMapper.targets
    │       ├── MonoAndroid/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── MonoTouch/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── net40/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── sl5/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── windows8/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── wp8/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       └── wpa81/
    │           ├── Install.ps1
    │           └── uninstall.ps1
    ├── CommonServiceLocator.1.3/
    │   ├── CommonServiceLocator.1.3.nupkg
    │   └── lib/
    │       └── portable-net4+sl5+netcore45+wpa81+wp8/
    │           └── Microsoft.Practices.ServiceLocation.XML
    ├── DotNetOpenAuth.AspNet.4.0.3.12153/
    │   ├── DotNetOpenAuth.AspNet.4.0.3.12153.nupkg
    │   └── lib/
    │       └── net40-full/
    │           └── DotNetOpenAuth.AspNet.xml
    ├── DotNetOpenAuth.AspNet.4.3.0.13117/
    │   ├── DotNetOpenAuth.AspNet.4.3.0.13117.nupkg
    │   └── lib/
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.AspNet.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.AspNet.xml
    ├── DotNetOpenAuth.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.Core.xml
    ├── DotNetOpenAuth.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.Core.xml
    ├── DotNetOpenAuth.OAuth.Consumer.4.0.3.12153/
    │   ├── DotNetOpenAuth.OAuth.Consumer.4.0.3.12153.nupkg
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OAuth.Consumer.xml
    ├── DotNetOpenAuth.OAuth.Consumer.4.3.0.13117/
    │   ├── DotNetOpenAuth.OAuth.Consumer.4.3.0.13117.nupkg
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OAuth.Consumer.xml
    ├── DotNetOpenAuth.OAuth.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.OAuth.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OAuth.xml
    ├── DotNetOpenAuth.OAuth.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.OAuth.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OAuth.xml
    ├── DotNetOpenAuth.OpenId.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.OpenId.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       └── net40-full/
    │           ├── DotNetOpenAuth.OpenId.xml
    │           ├── Mono.Math.xml
    │           └── Org.Mentalis.Security.Cryptography.xml
    ├── DotNetOpenAuth.OpenId.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.OpenId.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   ├── net35-full/
    │   │   │   └── web.config.transform
    │   │   ├── net40-full/
    │   │   │   └── web.config.transform
    │   │   └── net45-full/
    │   │       └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       ├── net40-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       └── net45-full/
    │           ├── DotNetOpenAuth.OpenId.xml
    │           ├── Mono.Math.xml
    │           └── Org.Mentalis.Security.Cryptography.xml
    ├── DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153/
    │   ├── DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OpenId.RelyingParty.xml
    ├── DotNetOpenAuth.OpenId.RelyingParty.4.3.0.13117/
    │   ├── DotNetOpenAuth.OpenId.RelyingParty.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OpenId.RelyingParty.xml
    ├── EnterpriseLibrary.Caching.5.0.505.0/
    │   ├── EnterpriseLibrary.Caching.5.0.505.0.nupkg
    │   ├── lib/
    │   │   ├── NET35/
    │   │   │   └── Microsoft.Practices.EnterpriseLibrary.Caching.xml
    │   │   └── SL40/
    │   │       └── Microsoft.Practices.EnterpriseLibrary.Caching.Silverlight.xml
    │   └── tools/
    │       ├── Utils.psm1
    │       └── install.ps1
    ├── EnterpriseLibrary.Common.5.0.505.0/
    │   ├── EnterpriseLibrary.Common.5.0.505.0.nupkg
    │   ├── lib/
    │   │   ├── NET35/
    │   │   │   └── Microsoft.Practices.EnterpriseLibrary.Common.xml
    │   │   └── SL40/
    │   │       └── Microsoft.Practices.EnterpriseLibrary.Common.Silverlight.xml
    │   └── tools/
    │       ├── Utils.psm1
    │       └── install.ps1
    ├── EntityFramework.5.0.0/
    │   ├── Content/
    │   │   ├── App.config.transform
    │   │   └── Web.config.transform
    │   ├── EntityFramework.5.0.0.nupkg
    │   ├── lib/
    │   │   ├── net40/
    │   │   │   └── EntityFramework.xml
    │   │   └── net45/
    │   │       └── EntityFramework.xml
    │   └── tools/
    │       ├── EntityFramework.PS3.psd1
    │       ├── EntityFramework.psd1
    │       ├── EntityFramework.psm1
    │       ├── Redirect.VS11.config
    │       ├── Redirect.config
    │       ├── about_EntityFramework.help.txt
    │       ├── init.ps1
    │       └── install.ps1
    ├── EntityFramework.6.1.3/
    │   ├── EntityFramework.6.1.3.nupkg
    │   ├── content/
    │   │   ├── App.config.transform
    │   │   └── Web.config.transform
    │   ├── lib/
    │   │   ├── net40/
    │   │   │   ├── EntityFramework.SqlServer.xml
    │   │   │   └── EntityFramework.xml
    │   │   └── net45/
    │   │       ├── EntityFramework.SqlServer.xml
    │   │       └── EntityFramework.xml
    │   └── tools/
    │       ├── EntityFramework.psd1
    │       ├── EntityFramework.psm1
    │       ├── about_EntityFramework.help.txt
    │       ├── init.ps1
    │       └── install.ps1
    ├── Microsoft.AspNet.Mvc.4.0.20710.0/
    │   ├── Microsoft.AspNet.Mvc.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Mvc.xml
    ├── Microsoft.AspNet.Razor.2.0.20710.0/
    │   ├── Microsoft.AspNet.Razor.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Razor.xml
    ├── Microsoft.AspNet.Web.Optimization.1.0.0/
    │   └── Microsoft.AspNet.Web.Optimization.1.0.0.nupkg
    ├── Microsoft.AspNet.WebApi.4.0.20710.0/
    │   └── Microsoft.AspNet.WebApi.4.0.20710.0.nupkg
    ├── Microsoft.AspNet.WebApi.Client.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.Client.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Net.Http.Formatting.xml
    ├── Microsoft.AspNet.WebApi.Core.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.Core.4.0.20710.0.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Http.xml
    ├── Microsoft.AspNet.WebApi.WebHost.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.WebHost.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Http.WebHost.xml
    ├── Microsoft.AspNet.WebPages.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           ├── System.Web.Helpers.xml
    │           ├── System.Web.WebPages.Deployment.xml
    │           ├── System.Web.WebPages.Razor.xml
    │           └── System.Web.WebPages.xml
    ├── Microsoft.AspNet.WebPages.Data.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.Data.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── WebMatrix.Data.xml
    ├── Microsoft.AspNet.WebPages.OAuth.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.OAuth.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── Microsoft.Web.WebPages.OAuth.xml
    ├── Microsoft.AspNet.WebPages.WebData.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.WebData.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── WebMatrix.WebData.xml
    ├── Microsoft.Net.Http.2.0.20710.0/
    │   ├── Microsoft.Net.Http.2.0.20710.0.nupkg
    │   └── lib/
    │       ├── net40/
    │       │   ├── System.Net.Http.WebRequest.xml
    │       │   └── System.Net.Http.xml
    │       └── net45/
    │           └── _._
    ├── Microsoft.Web.Infrastructure.1.0.0.0/
    │   └── Microsoft.Web.Infrastructure.1.0.0.0.nupkg
    ├── Microsoft.jQuery.Unobtrusive.Ajax.2.0.20710.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── jquery.unobtrusive-ajax.js
    │   └── Microsoft.jQuery.Unobtrusive.Ajax.2.0.20710.0.nupkg
    ├── Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── jquery.validate.unobtrusive.js
    │   └── Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0.nupkg
    ├── Modernizr.2.5.3/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── modernizr-2.5.3.js
    │   └── Modernizr.2.5.3.nupkg
    ├── Newtonsoft.Json.4.5.6/
    │   ├── Newtonsoft.Json.4.5.6.nupkg
    │   └── lib/
    │       ├── net20/
    │       │   └── Newtonsoft.Json.xml
    │       ├── net35/
    │       │   └── Newtonsoft.Json.xml
    │       ├── net40/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl3-wp/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl4/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl4-windowsphone71/
    │       │   └── Newtonsoft.Json.xml
    │       └── winrt45/
    │           └── Newtonsoft.Json.xml
    ├── Unity.3.5.1404.0/
    │   ├── Unity.3.5.1404.0.nupkg
    │   ├── UnityConfiguration30.xsd
    │   └── lib/
    │       ├── net45/
    │       │   ├── Microsoft.Practices.Unity.Configuration.XML
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │       │   └── Microsoft.Practices.Unity.xml
    │       ├── portable-net45+wp80+win8+MonoAndroid10+MonoTouch10/
    │       │   └── Microsoft.Practices.Unity.xml
    │       ├── win8/
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.pri
    │       │   └── Microsoft.Practices.Unity.xml
    │       └── wp80/
    │           ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │           └── Microsoft.Practices.Unity.xml
    ├── Unity.Interception.3.5.1404.0/
    │   ├── Unity.Interception.3.5.1404.0.nupkg
    │   └── lib/
    │       └── Net45/
    │           ├── Microsoft.Practices.Unity.Interception.Configuration.xml
    │           └── Microsoft.Practices.Unity.Interception.xml
    ├── WebGrease.1.1.0/
    │   └── WebGrease.1.1.0.nupkg
    ├── jQuery.1.7.1.1/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── jquery-1.7.1-vsdoc.js
    │   │       └── jquery-1.7.1.js
    │   ├── Tools/
    │   │   ├── common.ps1
    │   │   ├── install.ps1
    │   │   ├── jquery-1.7.1.intellisense.js
    │   │   └── uninstall.ps1
    │   └── jQuery.1.7.1.1.nupkg
    ├── jQuery.UI.Combined.1.8.20.1/
    │   ├── Content/
    │   │   ├── Content/
    │   │   │   └── themes/
    │   │   │       └── base/
    │   │   │           ├── jquery-ui.css
    │   │   │           ├── jquery.ui.accordion.css
    │   │   │           ├── jquery.ui.all.css
    │   │   │           ├── jquery.ui.autocomplete.css
    │   │   │           ├── jquery.ui.base.css
    │   │   │           ├── jquery.ui.button.css
    │   │   │           ├── jquery.ui.core.css
    │   │   │           ├── jquery.ui.datepicker.css
    │   │   │           ├── jquery.ui.dialog.css
    │   │   │           ├── jquery.ui.progressbar.css
    │   │   │           ├── jquery.ui.resizable.css
    │   │   │           ├── jquery.ui.selectable.css
    │   │   │           ├── jquery.ui.slider.css
    │   │   │           ├── jquery.ui.tabs.css
    │   │   │           └── jquery.ui.theme.css
    │   │   └── Scripts/
    │   │       └── jquery-ui-1.8.20.js
    │   └── jQuery.UI.Combined.1.8.20.1.nupkg
    ├── jQuery.Validation.1.9.0.1/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── jquery.validate-vsdoc.js
    │   │       └── jquery.validate.js
    │   └── jQuery.Validation.1.9.0.1.nupkg
    ├── knockoutjs.2.1.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── knockout-2.1.0.debug.js
    │   │       └── knockout-2.1.0.js
    │   └── knockoutjs.2.1.0.nupkg
    ├── log4net.2.0.3/
    │   ├── lib/
    │   │   ├── net10-full/
    │   │   │   └── log4net.xml
    │   │   ├── net11-full/
    │   │   │   └── log4net.xml
    │   │   ├── net20-full/
    │   │   │   └── log4net.xml
    │   │   ├── net35-client/
    │   │   │   └── log4net.xml
    │   │   ├── net35-full/
    │   │   │   └── log4net.xml
    │   │   ├── net40-client/
    │   │   │   └── log4net.xml
    │   │   └── net40-full/
    │   │       └── log4net.xml
    │   └── log4net.2.0.3.nupkg
    └── repositories.config

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs     diff=csharp
*.sln    merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union

# Standard to msysgit
*.doc	 diff=astextplain
*.DOC	 diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot  diff=astextplain
*.DOT  diff=astextplain
*.pdf  diff=astextplain
*.PDF	 diff=astextplain
*.rtf	 diff=astextplain
*.RTF	 diff=astextplain


================================================
FILE: .gitignore
================================================
#################
## Eclipse
#################

*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath


#################
## Visual Studio
#################

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.sln.docstates

# Build results

[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile

# Visual Studio profiler
*.psess
*.vsp
*.vspx

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
*.ncrunch*
.*crunch*.local.xml

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.Publish.xml
*.pubxml

# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/

# Windows Azure Build Output
csx
*.build.csdef

# Windows Store app package directory
AppPackages/

# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
App_Data/*.mdf
App_Data/*.ldf

#############
## Windows detritus
#############

# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Mac crap
.DS_Store


#############
## Python
#############

*.py[co]

# Packages
*.egg
*.egg-info
dist/
build/
eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg

# Installer logs
pip-log.txt

# Unit test / coverage reports
.coverage
.tox

#Translations
*.mo

#Mr Developer
.mr.developer.cfg


================================================
FILE: .nuget/NuGet.Config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

================================================
FILE: .nuget/NuGet.targets
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>

        <!-- Enable the restore command to run before builds -->
        <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>

        <!-- Property that enables building a package from a project -->
        <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>

        <!-- Determines if package restore consent is required to restore packages -->
        <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

        <!-- Download NuGet.exe if it does not already exist -->
        <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
    </PropertyGroup>

    <ItemGroup Condition=" '$(PackageSources)' == '' ">
        <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
        <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
        <!--
            <PackageSource Include="https://www.nuget.org/api/v2/" />
            <PackageSource Include="https://my-nuget-source/nuget/" />
        -->
    </ItemGroup>

    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
        <!-- Windows specific commands -->
        <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
        <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
        <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
    </PropertyGroup>

    <PropertyGroup>
        <PackagesProjectConfig Condition=" '$(OS)' == 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config</PackagesProjectConfig>
        <PackagesProjectConfig Condition=" '$(OS)' != 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config</PackagesProjectConfig>
    </PropertyGroup>

    <PropertyGroup>
      <PackagesConfig Condition="Exists('$(MSBuildProjectDirectory)\packages.config')">$(MSBuildProjectDirectory)\packages.config</PackagesConfig>
      <PackagesConfig Condition="Exists('$(PackagesProjectConfig)')">$(PackagesProjectConfig)</PackagesConfig>
    </PropertyGroup>
    
    <PropertyGroup>
        <!-- NuGet command -->
        <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
        <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>

        <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 "$(NuGetExePath)"</NuGetCommand>

        <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>

        <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
        <NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>

        <PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
        <PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>

        <!-- Commands -->
        <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
        <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>

        <!-- We need to ensure packages are restored prior to assembly resolve -->
        <BuildDependsOn Condition="$(RestorePackages) == 'true'">
            RestorePackages;
            $(BuildDependsOn);
        </BuildDependsOn>

        <!-- Make the build depend on restore packages -->
        <BuildDependsOn Condition="$(BuildPackage) == 'true'">
            $(BuildDependsOn);
            BuildPackage;
        </BuildDependsOn>
    </PropertyGroup>

    <Target Name="CheckPrerequisites">
        <!-- Raise an error if we're unable to locate nuget.exe  -->
        <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
        <!--
        Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
        This effectively acts as a lock that makes sure that the download operation will only happen once and all
        parallel builds will have to wait for it to complete.
        -->
        <MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
    </Target>

    <Target Name="_DownloadNuGet">
        <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
    </Target>

    <Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">        
        <Exec Command="$(RestoreCommand)"
              Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

        <Exec Command="$(RestoreCommand)"
              LogStandardErrorAsError="true"
              Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
    </Target>

    <Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
        <Exec Command="$(BuildCommand)"
              Condition=" '$(OS)' != 'Windows_NT' " />

        <Exec Command="$(BuildCommand)"
              LogStandardErrorAsError="true"
              Condition=" '$(OS)' == 'Windows_NT' " />
    </Target>

    <UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
            <OutputFilename ParameterType="System.String" Required="true" />
        </ParameterGroup>
        <Task>
            <Reference Include="System.Core" />
            <Using Namespace="System" />
            <Using Namespace="System.IO" />
            <Using Namespace="System.Net" />
            <Using Namespace="Microsoft.Build.Framework" />
            <Using Namespace="Microsoft.Build.Utilities" />
            <Code Type="Fragment" Language="cs">
                <![CDATA[
                try {
                    OutputFilename = Path.GetFullPath(OutputFilename);

                    Log.LogMessage("Downloading latest version of NuGet.exe...");
                    WebClient webClient = new WebClient();
                    webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);

                    return true;
                }
                catch (Exception ex) {
                    Log.LogErrorFromException(ex);
                    return false;
                }
            ]]>
            </Code>
        </Task>
    </UsingTask>
</Project>


================================================
FILE: OnlineStore.Application/AddressResolver.cs
================================================
using AutoMapper;
using OnlineStore.Domain.Model;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application
{
    public class AddressResolver : ValueResolver<AddressDto, Address>
    {
        protected override Address ResolveCore(AddressDto source)
        {
            return new Address
            {
                City = source.City,
                Country = source.Country,
                State = source.State,
                Street = source.Street,
                Zip = source.Zip
            };
        }
    }
}

================================================
FILE: OnlineStore.Application/ApplicationService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using OnlineStore.Domain;
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.ServiceContracts.ModelDTOs;
using OrderStatus = OnlineStore.Domain.Model.OrderStatus;

namespace OnlineStore.Application
{
    // 定义一个应用服务抽象类,以便把重复的代码放在该抽象类中
    public abstract class ApplicationService
    {
        private readonly IRepositoryContext _repositoryContext;

        protected ApplicationService(IRepositoryContext repositoryContext)
        {
            _repositoryContext = repositoryContext;
        }
        
        protected IRepositoryContext RepositorytContext 
        {
            get { return this._repositoryContext; }
        }

        #region Protected Methods

        // 判断给定字符串是否是Guid.Empty
        protected bool IsEmptyGuidString(string s)
        {
            if (string.IsNullOrWhiteSpace(s))
                return true;
            var guid = new Guid(s);
            return guid == Guid.Empty;
        }

       
        // 处理简单的聚合创建逻辑。
        protected TDtoList PerformCreateObjects<TDtoList, TDto, TAggregateRoot>(TDtoList dataTransferObjects,
            IRepository<TAggregateRoot> repository,
            Action<TDto> processDto = null,
            Action<TAggregateRoot> processAggregateRoot = null)
            where TDtoList : List<TDto>, new() where TAggregateRoot : class, IAggregateRoot
        {
            if (dataTransferObjects == null)
                throw new ArgumentNullException("dataTransferObjects");
            if (repository == null)
                throw new ArgumentNullException("repository");
            TDtoList result = new TDtoList();
            if (dataTransferObjects.Count <= 0) return result;
            var ars = new List<TAggregateRoot>();
            
            foreach (var dto in dataTransferObjects)
            {
                if (processDto != null)
                    processDto(dto);
                var ar = Mapper.Map<TDto, TAggregateRoot>(dto);
                if (processAggregateRoot != null)
                    processAggregateRoot(ar);
                ars.Add(ar);
                repository.Add(ar);
            }

            RepositorytContext.Commit();
            ars.ForEach(ar => result.Add(Mapper.Map<TAggregateRoot, TDto>(ar)));
            return result;
        }

        // 处理简单的聚合更新操作。
        protected TDtoList PerformUpdateObjects<TDtoList, TDataObject, TAggregateRoot>(TDtoList dataTransferObjects,
            IRepository<TAggregateRoot> repository,
            Func<TDataObject, string> idFunc,
            Action<TAggregateRoot, TDataObject> updateAction)
            where TDtoList : List<TDataObject>, new()
            where TAggregateRoot : class, IAggregateRoot
        {
            if (dataTransferObjects == null)
                throw new ArgumentNullException("dataTransferObjects");
            if (repository == null)
                throw new ArgumentNullException("repository");
            if (idFunc == null)
                throw new ArgumentNullException("idFunc");
            if (updateAction == null)
                throw new ArgumentNullException("updateAction");
            TDtoList result = null;
            if (dataTransferObjects.Count > 0)
            {
                result = new TDtoList();
                foreach (var dto in dataTransferObjects)
                {
                    if (IsEmptyGuidString(idFunc(dto)))
                        throw new ArgumentNullException("Id");
                    var id = new Guid(idFunc(dto));
                    var ar = repository.GetByKey(id);
                    updateAction(ar, dto);
                    repository.Update(ar);
                    result.Add(Mapper.Map<TAggregateRoot, TDataObject>(ar));
                }

                RepositorytContext.Commit();
            }
            return result;
        }

        // 处理简单的删除聚合根的操作。
        protected void PerformDeleteObjects<TAggregateRoot>(IList<string> ids, IRepository<TAggregateRoot> repository, Action<Guid> preDelete = null, Action<Guid> postDelete = null)
            where TAggregateRoot : class, IAggregateRoot
        {
            if (ids == null)
                throw new ArgumentNullException("ids");
            if (repository == null)
                throw new ArgumentNullException("repository");
            foreach (var id in ids)
            {
                var guid = new Guid(id);
                if (preDelete != null)
                    preDelete(guid);
                var ar = repository.GetByKey(guid);
                repository.Remove(ar);
                if (postDelete != null)
                    postDelete(guid);
            }

            RepositorytContext.Commit();
        }

        #endregion 

        // AutoMapper框架的初始化
        public static void Initialize()
        {
            Mapper.CreateMap<AddressDto, Address>();
            Mapper.CreateMap<UserDto, User>()
                .ForMember(uMermber => uMermber.ContactAddress, mceUto=> mceUto.ResolveUsing<AddressResolver>().FromMember(fm=>fm.ContactAddress))
                .ForMember(uMember => uMember.DeliveryAddress, mceUto =>
                        mceUto.ResolveUsing<AddressResolver>().FromMember(fm => fm.DeliveryAddress));

            Mapper.CreateMap<User, UserDto>()
               .ForMember(udoMember => udoMember.ContactAddress, mceU =>
                   mceU.ResolveUsing<InversedAddressResolver>().FromMember(fm => fm.ContactAddress))
                   .ForMember(udoMember => udoMember.DeliveryAddress, mceU =>
                       mceU.ResolveUsing<InversedAddressResolver>().FromMember(fm => fm.DeliveryAddress));

            Mapper.CreateMap<Product, ProductDto>();
            Mapper.CreateMap<ProductDto, Product>();
            Mapper.CreateMap<Category, CategoryDto>();
            Mapper.CreateMap<CategoryDto, Category>();
            Mapper.CreateMap<ShoppingCart, ShoppingCartDto>();
            Mapper.CreateMap<ShoppingCartDto, ShoppingCart>();
            Mapper.CreateMap<ShoppingCartItem, ShoppingCartItemDto>();
            Mapper.CreateMap<ShoppingCartItemDto, ShoppingCartItem>();
            Mapper.CreateMap<OrderItem, OrderItemDto>();
            Mapper.CreateMap<OrderItemDto, OrderItem>();
            Mapper.CreateMap<Order, OrderDto>()
                //.ForMember(odtoMember => odtoMember.Subtotal,
                //    mceO => mceO.ResolveUsing(
                //        o => o.OrderItems.Sum(item => item.ItemAmout)))
                .ForMember(odtoMember => odtoMember.UserContact,
                    mceO => mceO.ResolveUsing(o => o.User.Contact))
                .ForMember(odtoMember => odtoMember.UserPhone,
                    mceO => mceO.ResolveUsing(o => o.User.PhoneNumber))
                .ForMember(odtoMember => odtoMember.UserEmail,
                    mceO => mceO.ResolveUsing(o => o.User.Email))
                .ForMember(odtoMember => odtoMember.UserId,
                    mceO => mceO.ResolveUsing(o => o.User.Id))
                .ForMember(odtoMember => odtoMember.UserName,
                    mceO => mceO.ResolveUsing(o => o.User.UserName))
                .ForMember(odtoMember => odtoMember.UserAddressCountry,
                    mceO => mceO.ResolveUsing(o => o.User.DeliveryAddress.Country))
                .ForMember(odtoMember => odtoMember.UserAddressState,
                    mceO => mceO.ResolveUsing(o => o.User.DeliveryAddress.State))
                .ForMember(odtoMember => odtoMember.UserAddressCity,
                    mceO => mceO.ResolveUsing(o => o.User.DeliveryAddress.City))
                .ForMember(odtoMember => odtoMember.UserAddressStreet,
                    mceO => mceO.ResolveUsing(o => o.User.DeliveryAddress.Street))
                .ForMember(odtoMember => odtoMember.UserAddressZip,
                    mceO => mceO.ResolveUsing(o => o.User.DeliveryAddress.Zip))
                .ForMember(odtoMember => odtoMember.Status,
                    mceO => mceO.ResolveUsing(o =>
                    {
                        switch (o.Status)
                        {
                            case OrderStatus.Created:
                                return OrderStatusDto.Created;
                            case OrderStatus.Delivered:
                                return OrderStatusDto.Delivered;
                            case OrderStatus.Dispatched:
                                return OrderStatusDto.Dispatched;
                            case OrderStatus.Paid:
                                return OrderStatusDto.Paid;
                            case OrderStatus.Picked:
                                return OrderStatusDto.Picked;
                            default:
                                throw new InvalidOperationException();
                        }
                    }));
            Mapper.CreateMap<OrderDto, Order>();
            Mapper.CreateMap<ProductCategorization, ProductCategorizationDto>();
            Mapper.CreateMap<ProductCategorizationDto, ProductCategorization>();
            Mapper.CreateMap<Role, RoleDto>();
            Mapper.CreateMap<RoleDto, Role>();
        }

    }
}

================================================
FILE: OnlineStore.Application/Global.asax
================================================
<%@ Application Codebehind="Global.asax.cs" Inherits="OnlineStore.Application.Global" Language="C#" %>


================================================
FILE: OnlineStore.Application/Global.asax.cs
================================================
using System;
using System.Web;
using OnlineStore.Repositories.EntityFramework;

namespace OnlineStore.Application
{
    public class Global : HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            OnlineStoreDbContextInitailizer.Initialize();
            ApplicationService.Initialize();
            log4net.Config.XmlConfigurator.Configure();
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

================================================
FILE: OnlineStore.Application/InversedAddressResolver.cs
================================================
using AutoMapper;
using OnlineStore.Domain.Model;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application
{
    public class InversedAddressResolver : ValueResolver<Address, AddressDto>
    {
        protected override AddressDto ResolveCore(Address source)
        {
            return new AddressDto
            {
                City = source.City,
                Country = source.Country,
                State = source.State,
                Street = source.Street,
                Zip = source.Zip
            };
        }
    }
}

================================================
FILE: OnlineStore.Application/Logs/onlinestore.txt
================================================


================================================
FILE: OnlineStore.Application/OnlineStore.Application.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>
    </ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C4B3BA5F-A38D-4E52-B49E-6D69E8619016}</ProjectGuid>
    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>OnlineStore.Application</RootNamespace>
    <AssemblyName>OnlineStore.Application</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <WcfConfigValidationEnabled>True</WcfConfigValidationEnabled>
    <UseIISExpress>true</UseIISExpress>
    <IISExpressSSLPort />
    <IISExpressAnonymousAuthentication />
    <IISExpressWindowsAuthentication />
    <IISExpressUseClassicPipelineMode />
    <TargetFrameworkProfile />
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
    <RestorePackages>true</RestorePackages>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="AutoMapper, Version=3.3.1.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
      <HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="AutoMapper.Net4">
      <HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
    <Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\EnterpriseLibrary.Caching.5.0.505.0\lib\NET35\Microsoft.Practices.EnterpriseLibrary.Caching.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\EnterpriseLibrary.Common.5.0.505.0\lib\NET35\Microsoft.Practices.EnterpriseLibrary.Common.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>
    </Reference>
    <Reference Include="Microsoft.Practices.Unity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Unity.3.5.1404.0\lib\net45\Microsoft.Practices.Unity.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Practices.Unity.Configuration, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Unity.3.5.1404.0\lib\net45\Microsoft.Practices.Unity.Configuration.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Practices.Unity.Interception, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Unity.Interception.3.5.1404.0\lib\Net45\Microsoft.Practices.Unity.Interception.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Practices.Unity.Interception.Configuration, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Unity.Interception.3.5.1404.0\lib\Net45\Microsoft.Practices.Unity.Interception.Configuration.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Practices.Unity.RegistrationByConvention, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Unity.3.5.1404.0\lib\net45\Microsoft.Practices.Unity.RegistrationByConvention.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Transactions" />
    <Reference Include="System.Web.DynamicData" />
    <Reference Include="System.Web.Entity" />
    <Reference Include="System.Web.ApplicationServices" />
    <Reference Include="System" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Data" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.EnterpriseServices" />
    <Reference Include="System.Runtime.Serialization" />
    <Reference Include="System.ServiceModel" />
    <Reference Include="System.ServiceModel.Web" />
    <Reference Include="System.Web" />
    <Reference Include="System.Web.Extensions" />
    <Reference Include="System.Web.Services" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Xml.Linq" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="App_Data\OnlineStore.mdf" />
    <Content Include="App_Data\OnlineStore_log.ldf">
      <DependentUpon>OnlineStore.mdf</DependentUpon>
    </Content>
    <Content Include="Global.asax" />
    <Content Include="OrderService.svc" />
    <Content Include="ProductService.svc" />
    <Content Include="UserService.svc" />
    <Content Include="Web.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="AddressResolver.cs" />
    <Compile Include="ApplicationService.cs" />
    <Compile Include="Global.asax.cs">
      <DependentUpon>Global.asax</DependentUpon>
    </Compile>
    <Compile Include="InversedAddressResolver.cs" />
    <Compile Include="OrderService.svc.cs">
      <DependentUpon>OrderService.svc</DependentUpon>
    </Compile>
    <Compile Include="ProductService.svc.cs">
      <DependentUpon>ProductService.svc</DependentUpon>
    </Compile>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="ServiceImplementations\OrderServiceImp.cs" />
    <Compile Include="ServiceImplementations\ProductServiceImp.cs" />
    <Compile Include="ServiceImplementations\UserServiceImp.cs" />
    <Compile Include="UserService.svc.cs">
      <DependentUpon>UserService.svc</DependentUpon>
    </Compile>
  </ItemGroup>
  <ItemGroup />
  <ItemGroup>
    <Content Include="packages.config" />
    <None Include="Web.Debug.config">
      <DependentUpon>Web.config</DependentUpon>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="Web.Release.config">
      <DependentUpon>Web.config</DependentUpon>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\OnlineStore.Domain\OnlineStore.Domain.csproj">
      <Project>{1ae7732f-2faf-407e-89dd-bad81c4132e0}</Project>
      <Name>OnlineStore.Domain</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Events.Handlers\OnlineStore.Events.Handlers.csproj">
      <Project>{2471e6b9-1030-48b8-bbc4-5018a221fbe2}</Project>
      <Name>OnlineStore.Events.Handlers</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Events\OnlineStore.Events.csproj">
      <Project>{f165abc2-f76a-4fd7-8675-833264855221}</Project>
      <Name>OnlineStore.Events</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Infrastructure\OnlineStore.Infrastructure.csproj">
      <Project>{9dde33cc-cf3c-436e-8a5f-4e1f0f8b603e}</Project>
      <Name>OnlineStore.Infrastructure</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Repositories\OnlineStore.Repositories.csproj">
      <Project>{30afab37-57be-459c-a36a-5a72bbf77529}</Project>
      <Name>OnlineStore.Repositories</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.ServiceContract\OnlineStore.ServiceContracts.csproj">
      <Project>{d46d13dd-1e1a-451b-ad17-42ed3fc54eac}</Project>
      <Name>OnlineStore.ServiceContracts</Name>
    </ProjectReference>
  </ItemGroup>
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
        <WebProjectProperties>
          <UseIIS>True</UseIIS>
          <AutoAssignPort>True</AutoAssignPort>
          <DevelopmentServerPort>8003</DevelopmentServerPort>
          <DevelopmentServerVPath>/</DevelopmentServerVPath>
          <IISUrl>http://localhost:8003/</IISUrl>
          <NTLMAuthentication>False</NTLMAuthentication>
          <UseCustomServer>False</UseCustomServer>
          <CustomServerUrl>
          </CustomServerUrl>
          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
        </WebProjectProperties>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
  <Import Project="..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets" Condition="Exists('..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets')" />
  <Import Project="..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets" Condition="Exists('..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets')" />
  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: OnlineStore.Application/OrderService.svc
================================================
<%@ ServiceHost Language="C#" Debug="true" Service="OnlineStore.Application.OrderService" CodeBehind="OrderService.svc.cs" %>


================================================
FILE: OnlineStore.Application/OrderService.svc.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using OnlineStore.Domain.Model;
using OnlineStore.Infrastructure;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application
{
   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class OrderService : IOrderService
   {
       private readonly IOrderService _orderServiceImp;

       public OrderService()
       {
           _orderServiceImp = ServiceLocator.Instance.GetService<IOrderService>();
       }

       public void AddProductToCart(Guid customerId, Guid productId, int quantity)
        {
           try
           {
               _orderServiceImp.AddProductToCart(customerId, productId, quantity);
           }
           catch (Exception ex)
           {
               throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
           }
        }

        public ShoppingCartDto GetShoppingCart(Guid customerId)
        {
            try
            {
                return _orderServiceImp.GetShoppingCart(customerId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public int GetShoppingCartItemCount(Guid userId)
        {
            try
            {
                return _orderServiceImp.GetShoppingCartItemCount(userId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void UpdateShoppingCartItem(Guid shoppingCartItemId, int quantity)
        {
            try
            {
                _orderServiceImp.UpdateShoppingCartItem(shoppingCartItemId, quantity);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void DeleteShoppingCartItem(Guid shoppingCartItemId)
        {
            try
            {
                _orderServiceImp.DeleteShoppingCartItem(shoppingCartItemId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public OrderDto Checkout(Guid customerId)
        {
            try
            {
                return _orderServiceImp.Checkout(customerId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }


        public OrderDto GetOrder(Guid orderId)
        {
            try
            {
                return _orderServiceImp.GetOrder(orderId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<OrderDto> GetOrdersForUser(Guid userId)
        {
            try
            {
                return _orderServiceImp.GetOrdersForUser(userId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<OrderDto> GetAllOrders()
        {
            try
            {
                return _orderServiceImp.GetAllOrders();
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void Confirm(Guid orderId)
        {
            try
            {
                 _orderServiceImp.Confirm(orderId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void Dispatch(Guid orderId)
        {
            try
            {
                _orderServiceImp.Dispatch(orderId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }
   }
}


================================================
FILE: OnlineStore.Application/ProductService.svc
================================================
<%@ ServiceHost Language="C#" Debug="true" Service="OnlineStore.Application.ProductService" CodeBehind="ProductService.svc.cs" %>

================================================
FILE: OnlineStore.Application/ProductService.svc.cs
================================================
using System;
using System.Collections.Generic;
using System.ServiceModel;
using OnlineStore.Infrastructure;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application
{
    // 商品WCF服务
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class ProductService : IProductService
    {
        // 引用商品服务接口
        private readonly IProductService _productService;

        public ProductService()
        {
            _productService = ServiceLocator.Instance.GetService<IProductService>();
        }

        public IEnumerable<ProductDto> GetProducts()
        {
            try
            {
                return _productService.GetProducts();
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IEnumerable<ProductDto> GetProductsForCategory(Guid categoryId)
        {
            try
            {
                return _productService.GetProductsForCategory(categoryId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IEnumerable<ProductDto> GetNewProducts(int count)
        {
            try
            {
                return _productService.GetNewProducts(count);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public CategoryDto GetCategoryById(Guid id)
        {
            try
            {
                return _productService.GetCategoryById(id);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IEnumerable<CategoryDto> GetCategories()
        {
            try
            {
                return _productService.GetCategories();
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public ProductDto GetProductById(Guid id)
        {
            try
            {
                return _productService.GetProductById(id);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public List<ProductDto> CreateProducts(List<ProductDto> productsDtos)
        {
            try
            {
                return _productService.CreateProducts(productsDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public List<CategoryDto> CreateCategories(List<CategoryDto> categoriDtos)
        {
            try
            {
                return _productService.CreateCategories(categoriDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public List<ProductDto> UpdateProducts(List<ProductDto> productsDtos)
        {
            try
            {
                return _productService.UpdateProducts(productsDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public List<CategoryDto> UpdateCategories(List<CategoryDto> categoriDtos)
        {
            try
            {
                return _productService.UpdateCategories(categoriDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void DeleteProducts(List<string> produtList)
        {
            try
            {
                _productService.DeleteProducts(produtList);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void DeleteCategories(List<string> categoryList)
        {
            try
            {
                _productService.DeleteCategories(categoryList);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public ProductCategorizationDto CategorizeProduct(Guid productId, Guid categoryId)
        {
            try
            {
                return _productService.CategorizeProduct(productId, categoryId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void UncategorizeProduct(Guid productId)
        {
            try
            {
                _productService.UncategorizeProduct(productId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public ProductDtoWithPagination GetProductsWithPagination(Pagination pagination)
        {
            try
            {
                return _productService.GetProductsWithPagination(pagination);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public ProductDtoWithPagination GetProductsForCategoryWithPagination(Guid categoryId, Pagination pagination)
        {
            try
            {
                return _productService.GetProductsForCategoryWithPagination(categoryId, pagination);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }
    }
}

================================================
FILE: OnlineStore.Application/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OnlineStore.Application")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OnlineStore.Application")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("dac59b79-780a-4aa9-a382-7e2af67b7d0c")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Revision and Build Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: OnlineStore.Application/ServiceImplementations/OrderServiceImp.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using OnlineStore.Domain;
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.Domain.Specifications;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;
using System.Linq;
using System.Transactions;
using OnlineStore.Domain.Services;
using OnlineStore.Events.Bus;

namespace OnlineStore.Application.ServiceImplementations
{
    public class OrderServiceImp : ApplicationService, IOrderService
    {
        #region Private Fileds
        private readonly IShoppingCartRepository _shoppingCartRepository;
        private readonly IShoppingCartItemRepository _shoppingCartItemRepository;
        private readonly IUserRepository _userRepository;
        private readonly IOrderRepository _orderRepository;
        private readonly IProductRepository _productRepository;
        private readonly IDomainService _domainService;
        private readonly IEventBus _eventBus;
        #endregion 

        #region Ctor
        public OrderServiceImp(IRepositoryContext context, 
            IUserRepository userRepository, 
            IShoppingCartRepository shoppingCartRepository, 
            IProductRepository productRepository, 
            IShoppingCartItemRepository shoppingCartItemRepository, 
            IDomainService domainService, 
            IOrderRepository orderRepository, 
            IEventBus eventBus) : base(context)
        {
            _userRepository = userRepository;
            _shoppingCartRepository = shoppingCartRepository;
            _productRepository = productRepository;
            _shoppingCartItemRepository = shoppingCartItemRepository;
            _domainService = domainService;
            _orderRepository = orderRepository;
            _eventBus = eventBus;
        }

        #endregion 

        #region IOrderService Members

        public void AddProductToCart(Guid customerId, Guid productId, int quantity)
        {
            var user = _userRepository.GetByKey(customerId);

            var shoppingCart = _shoppingCartRepository.GetBySpecification(new ExpressionSpecification<ShoppingCart>(s=>s.User.Id == user.Id));
            if (shoppingCart == null)
                throw new DomainException("用户{0}不存在购物车.", customerId);

            var product = _productRepository.GetByKey(productId);
            var shoppingCartItem = _shoppingCartItemRepository.FindItem(shoppingCart, product);
            if (shoppingCartItem == null)
            {
                shoppingCartItem = new ShoppingCartItem()
                {
                    Product = product,
                    ShoopingCart = shoppingCart,
                    Quantity = quantity
                };

                _shoppingCartItemRepository.Add(shoppingCartItem);
            }
            else
            {
                shoppingCartItem.UpdateQuantity(shoppingCartItem.Quantity + quantity);
                _shoppingCartItemRepository.Update(shoppingCartItem);
            }

            RepositorytContext.Commit();
        }

        public ShoppingCartDto GetShoppingCart(Guid customerId)
        {
            var user = _userRepository.GetByKey(customerId);

            var shoppingCart = _shoppingCartRepository.GetBySpecification(
                new ExpressionSpecification<ShoppingCart>(s => s.User.Id == user.Id));
            if (shoppingCart == null)
                throw new DomainException("用户{0}不存在购物车.", customerId);

            var shoppingCartItems =
                _shoppingCartItemRepository.GetAll(
                    new ExpressionSpecification<ShoppingCartItem>(s => s.ShoopingCart.Id == shoppingCart.Id), elp => elp.Product);

            var shoppingCartDto = Mapper.Map<ShoppingCart, ShoppingCartDto>(shoppingCart);
            shoppingCartDto.Items = new List<ShoppingCartItemDto>();
            if (shoppingCartItems != null && shoppingCartItems.Any())
            {
                shoppingCartItems
                    .ToList()
                    .ForEach(s => shoppingCartDto.Items.Add(Mapper.Map<ShoppingCartItem, ShoppingCartItemDto>(s)));
                shoppingCartDto.Subtotal = shoppingCartDto.Items.Sum(p => p.ItemAmount);
            }

            return shoppingCartDto;
        }

        public int GetShoppingCartItemCount(Guid userId)
        {
            var user = _userRepository.GetByKey(userId);
            var shoppingCart = _shoppingCartRepository.GetBySpecification(new ExpressionSpecification<ShoppingCart>(s => s.User.Id == user.Id));
            if(shoppingCart == null)
                throw new InvalidOperationException("没有可用的购物车实例.");
            var shoppingCartItems =
                _shoppingCartItemRepository.GetAll(new ExpressionSpecification<ShoppingCartItem>(s => s.ShoopingCart.Id == shoppingCart.Id), elp => elp.Product);
            return shoppingCartItems.Sum(s => s.Quantity);
        }

        public void UpdateShoppingCartItem(Guid shoppingCartItemId, int quantity)
        {
            var shoppingCartItem = _shoppingCartItemRepository.GetByKey(shoppingCartItemId);
            shoppingCartItem.UpdateQuantity(quantity);
            _shoppingCartItemRepository.Update(shoppingCartItem);
            RepositorytContext.Commit();
        }

        public void DeleteShoppingCartItem(Guid shoppingCartItemId)
        {
            var shoppingCartItem = _shoppingCartItemRepository.GetByKey(shoppingCartItemId);
            _shoppingCartItemRepository.Remove(shoppingCartItem);
            RepositorytContext.Commit();
        }

        public OrderDto Checkout(Guid customerId)
        {
            var user = _userRepository.GetByKey(customerId);
            var shoppingCart = _shoppingCartRepository.GetByExpression(s => s.User.Id == user.Id);
            var order = _domainService.CreateOrder(user, shoppingCart);

            return Mapper.Map<Order, OrderDto>(order);
        }

        public OrderDto GetOrder(Guid orderId)
        {
            var order = _orderRepository.GetBySpecification(new ExpressionSpecification<Order>(o=>o.Id.Equals(orderId)), elp=>elp.OrderItems);
            return Mapper.Map<Order, OrderDto>(order);
        }

        // 获得指定用户的所有订单
        public IList<OrderDto> GetOrdersForUser(Guid userId)
        {
            var user = _userRepository.GetByKey(userId);
            var orders = _orderRepository.GetAll(new ExpressionSpecification<Order>(o => o.User.Id == userId), sp => sp.CreatedDate, SortOrder.Descending, elp=>elp.OrderItems);
            var orderDtos = new List<OrderDto>();
            orders
                .ToList()
                .ForEach(o=>orderDtos.Add(Mapper.Map<Order, OrderDto>(o)));
            return orderDtos;
        }

        public IList<OrderDto> GetAllOrders()
        {
            var orders = _orderRepository.GetAll(sort => sort.CreatedDate, SortOrder.Descending);
            var orderDtos = new List<OrderDto>();
            orders
                .ToList()
                .ForEach(o=>orderDtos.Add(Mapper.Map<Order, OrderDto>(o)));
            return orderDtos;
        }

        public void Confirm(Guid orderId)
        {
            using (var transactionScope = new TransactionScope())
            {
                var order = _orderRepository.GetByKey(orderId);
                order.Confirm();
                _orderRepository.Update(order);

                RepositorytContext.Commit();
                _eventBus.Commit();
                transactionScope.Complete();
            }
        }

        public void Dispatch(Guid orderId)
        {
            using (var transactionScope = new TransactionScope())
            {
                var order = _orderRepository.GetByKey(orderId);
                order.Dispatch();
                _orderRepository.Update(order);
                RepositorytContext.Commit();
                _eventBus.Commit();
                transactionScope.Complete();
            }
        }

        #endregion 
    }
}

================================================
FILE: OnlineStore.Application/ServiceImplementations/ProductServiceImp.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.Domain.Services;
using OnlineStore.Domain.Specifications;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application.ServiceImplementations
{
    // 商品服务的实现
    public class ProductServiceImp : ApplicationService, IProductService
    {
        #region Private Fields
        private readonly IProductRepository _productRepository;
        private readonly ICategoryRepository _categoryRepository;
        private readonly IProductCategorizationRepository _productCategorizationRepository;
        private readonly IDomainService _domainService;
        #endregion 

        #region Ctor
        public ProductServiceImp(IRepositoryContext context,
            IProductRepository productRepository, 
            ICategoryRepository categoryRepository, 
            IProductCategorizationRepository productCategorizationRepository,
            IDomainService domainService) :base(context)
        {
            _categoryRepository = categoryRepository;
            _productRepository = productRepository;
            _productCategorizationRepository = productCategorizationRepository;
            _domainService = domainService;
        }

        #endregion

        #region IProductService Members
        public IEnumerable<ProductDto> GetProducts()
        {
            var result = new List<ProductDto>();

             _productRepository.
                GetAll().
                ToList().
                ForEach(p =>
                {
                    var productDto = Mapper.Map<Product, ProductDto>(p);
                    {
                        var category = _productCategorizationRepository.GetCategoryForProduct(p);
                        if (category != null)
                            productDto.Category = Mapper.Map<Category, CategoryDto>(category);
                    }

                    result.Add(productDto);
                });

            return result;
        }

        public ProductDtoWithPagination GetProductsWithPagination(Pagination pagination)
        {
            var pagedProducts = _productRepository.GetAll(sp => sp.Name, SortOrder.Ascending, pagination.PageNumber,
                pagination.PageSize);
            pagination.TotalPages = pagedProducts.TotalPages;

            var productDtoList = new List<ProductDto>();
            pagedProducts.PageData.ToList().ForEach(p=>productDtoList.Add(Mapper.Map<Product, ProductDto>(p)));
            return  new ProductDtoWithPagination()
            {
                Pagination = pagination,
                ProductDtos = productDtoList
            };
        }

        public IEnumerable<ProductDto> GetProductsForCategory(Guid categoryId)
        {
            var result = new List<ProductDto>();

            var category = _categoryRepository.GetByKey(categoryId);
            var products = _productCategorizationRepository.GetProductsForCategory(category);
            products.ToList().ForEach(p=>result.Add(Mapper.Map<Product, ProductDto>(p)));
            return result;
        }

        public ProductDtoWithPagination GetProductsForCategoryWithPagination(Guid categoryId, Pagination pagination)
        {
            var category = _categoryRepository.GetByKey(categoryId);
            var pagedProducts = _productCategorizationRepository.GetProductsForCategoryWithPagination(category, pagination.PageNumber,
                pagination.PageSize);
            if (pagedProducts == null)
            {
                pagination.TotalPages = 0;
                return new ProductDtoWithPagination()
                {
                    Pagination = pagination,
                    ProductDtos = new List<ProductDto>()
                };
            }
            
            pagination.TotalPages = pagedProducts.TotalPages;
            var productDtoList = new List<ProductDto>();
            pagedProducts.PageData.ToList().ForEach(p=>productDtoList.Add(Mapper.Map<Product, ProductDto>(p)));
            return new ProductDtoWithPagination()
            {

                Pagination = pagination,
                ProductDtos = productDtoList
            };
        }

        public IEnumerable<ProductDto> GetNewProducts(int count)
        {
            var newProducts = new List<ProductDto>();
            _productRepository.GetNewProducts(count)
                .ToList()
                .ForEach
                (
                    np => newProducts.Add(Mapper.Map<Product, ProductDto>(np))
                );

            return newProducts;
        }

        public CategoryDto GetCategoryById(Guid id)
        {
            var category = _categoryRepository.GetByKey(id);
            var result = Mapper.Map<Category, CategoryDto>(category);
            
            return result;
        }

        public IEnumerable<CategoryDto> GetCategories()
        {
            var result = new List<CategoryDto>();

            _categoryRepository.GetAll().ToList().ForEach(c =>
            {
                var categoryDto = Mapper.Map<Category, CategoryDto>(c);
                result.Add(categoryDto);
            });

            return result;
        }

        public ProductDto GetProductById(Guid id)
        {
            var product = _productRepository.GetByKey(id);
            var result = Mapper.Map<Product, ProductDto>(product);
            result.Category =
                Mapper.Map<Category, CategoryDto>(_productCategorizationRepository.GetCategoryForProduct(product));
            return result;
        }

        public List<ProductDto> CreateProducts(List<ProductDto> productsDtos)
        {
            return PerformCreateObjects<List<ProductDto>, ProductDto, Product>(productsDtos, _productRepository);
        }

        public List<CategoryDto> CreateCategories(List<CategoryDto> categoriDtos)
        {
            return PerformCreateObjects<List<CategoryDto>, CategoryDto, Category>(categoriDtos, _categoryRepository);
        }

        public List<ProductDto> UpdateProducts(List<ProductDto> productsDtos)
        {
            return PerformUpdateObjects<List<ProductDto>, ProductDto, Product>(productsDtos,
                _productRepository,
                pdto => pdto.Id,
                (p, pdto) =>
                {
                    if (!string.IsNullOrEmpty(pdto.Description))
                        p.Description = pdto.Description;
                    if (!string.IsNullOrEmpty(pdto.ImageUrl))
                        p.ImageUrl = pdto.ImageUrl;
                    if (!string.IsNullOrEmpty(pdto.Name))
                        p.Name = pdto.Name;
                    if (pdto.IsNew != null)
                        p.IsNew = pdto.IsNew.Value;
                    if (pdto.UnitPrice != null)
                        p.UnitPrice = pdto.UnitPrice.Value;
                });
        }

        public List<CategoryDto> UpdateCategories(List<CategoryDto> categoriDtos)
        {
            return PerformUpdateObjects<List<CategoryDto>, CategoryDto, Category>(categoriDtos,
                _categoryRepository,
                cdto => cdto.Id,
                (c, cdto) =>
                {
                    if (!string.IsNullOrEmpty(cdto.Name))
                        c.Name = cdto.Name;
                    if (!string.IsNullOrEmpty(cdto.Description))
                        c.Description = cdto.Description;
                });
        }

        public void DeleteProducts(List<string> produList)
        {
            PerformDeleteObjects<Product>(produList,
                _productRepository,
                id =>
                {
                    var categorization = _productCategorizationRepository.GetBySpecification(Specification<ProductCategorization>.Eval(c => c.ProductId == id));
                    if (categorization != null)
                        _productCategorizationRepository.Remove(categorization);
                });
        }

        public void DeleteCategories(List<string> categoryList)
        {
            PerformDeleteObjects<Category>(categoryList,
                _categoryRepository,
                id =>
                {
                    var categorization = _productCategorizationRepository.GetBySpecification(Specification<ProductCategorization>.Eval(c => c.CategoryId == id));
                    if (categorization != null)
                        _productCategorizationRepository.Remove(categorization);
                });
        }

        public ProductCategorizationDto CategorizeProduct(Guid productId, Guid categoryId)
        {
            if (productId == Guid.Empty)
                throw new ArgumentNullException("productId");
            if (categoryId == Guid.Empty)
                throw new ArgumentNullException("categoryId");
            var product = _productRepository.GetByKey(productId);
            var category = _categoryRepository.GetByKey(categoryId);
            return Mapper.Map<ProductCategorization, ProductCategorizationDto>(_domainService.Categorize(product, category));
        }

        public void UncategorizeProduct(Guid productId)
        {
            if (productId == Guid.Empty)
                throw new ArgumentNullException("productId");
            var product = _productRepository.GetByKey(productId);
            _domainService.Uncategorize(product);
        }

      
        #endregion  
    }
}

================================================
FILE: OnlineStore.Application/ServiceImplementations/UserServiceImp.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using AutoMapper;
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.Domain.Services;
using OnlineStore.Domain.Specifications;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application.ServiceImplementations
{
    public class UserServiceImp :ApplicationService, IUserService
    {
        private readonly IUserRepository _userRepository;
        private readonly IShoppingCartRepository _shoppingCartRepository;
        private readonly IUserRoleRepository _userRoleRepository;
        private readonly IRoleRepository _roleRepository;
        private readonly IDomainService _domainService;

        public UserServiceImp(IRepositoryContext repositoryContext, 
            IUserRepository userRepository, 
            IShoppingCartRepository shoppingCartRepository, 
            IDomainService domainService, 
            IRoleRepository roleRepository, 
            IUserRoleRepository userRoleRepository)
            : base(repositoryContext)
        {
            _userRepository = userRepository;
            _shoppingCartRepository = shoppingCartRepository;
            _domainService = domainService;
            _roleRepository = roleRepository;
            _userRoleRepository = userRoleRepository;
        }

        #region IUserService Members
        public IList<UserDto> CreateUsers(List<UserDto> userDtos)
        {
            if (userDtos == null)
                throw new ArgumentNullException("userDtos");
            return PerformCreateObjects<List<UserDto>, UserDto, User>(userDtos,
                _userRepository,
                dto =>
                {
                    if (dto.RegisteredDate == null)
                        dto.RegisteredDate = DateTime.Now;
                },
                ar =>
                {
                    var shoppingCart = ar.CreateShoppingCart();
                    _shoppingCartRepository.Add(shoppingCart);
                });
        }

        public bool ValidateUser(string userName, string password)
        {
            if (string.IsNullOrEmpty(userName))
                throw new ArgumentNullException("userName");
            if (string.IsNullOrEmpty(password))
                throw new ArgumentNullException("password");

            return _userRepository.CheckPassword(userName, password);
        }

        public bool DisableUser(UserDto userDto)
        {
            if(userDto == null)
                throw new ArgumentNullException("userDto");
            User user;
            if (!IsEmptyGuidString(userDto.Id))
                user = _userRepository.GetByKey(new Guid(userDto.Id));
            else if (!string.IsNullOrEmpty(userDto.UserName))
                user = _userRepository.GetByExpression(u=>u.UserName == userDto.UserName);
            else if (!string.IsNullOrEmpty(userDto.Email))
                user = _userRepository.GetByExpression(u => u.Email == userDto.Email);
            else
                throw new ArgumentNullException("userDto", "Either ID, UserName or Email should be specified.");
            user.Disable();
            _userRepository.Update(user);
            RepositorytContext.Commit();
            return user.IsDisabled;
        }

        public bool EnableUser(UserDto userDto)
        {
            if (userDto == null)
                throw new ArgumentNullException("userDto");
            User user;
            if (!IsEmptyGuidString(userDto.Id))
                user = _userRepository.GetByKey(new Guid(userDto.Id));
            else if (!string.IsNullOrEmpty(userDto.UserName))
                user = _userRepository.GetByExpression(u => u.UserName == userDto.UserName);
            else if (!string.IsNullOrEmpty(userDto.Email))
                user = _userRepository.GetByExpression(u => u.Email == userDto.Email);
            else
                throw new ArgumentNullException("userDto", "Either ID, UserName or Email should be specified.");
            user.Enable();
            _userRepository.Update(user);
            RepositorytContext.Commit();
            return user.IsDisabled;
        }

        public IList<UserDto> UpdateUsers(List<UserDto> userDataObjects)
        {
            return PerformUpdateObjects<List<UserDto>, UserDto, User>(userDataObjects, _userRepository,
                userDto => userDto.Id,
                (u, userDto) =>
                {
                    if (!string.IsNullOrEmpty(userDto.Contact))
                        u.Contact = userDto.Contact;
                    if (!string.IsNullOrEmpty(userDto.PhoneNumber))
                        u.PhoneNumber = userDto.PhoneNumber;
                    if (userDto.ContactAddress != null)
                    {
                        if (!string.IsNullOrEmpty(userDto.ContactAddress.City))
                            u.ContactAddress.City = userDto.ContactAddress.City;
                        if (!string.IsNullOrEmpty(userDto.ContactAddress.Country))
                            u.ContactAddress.Country = userDto.ContactAddress.Country;
                        if (!string.IsNullOrEmpty(userDto.ContactAddress.State))
                            u.ContactAddress.State = userDto.ContactAddress.State;
                        if (!string.IsNullOrEmpty(userDto.ContactAddress.Street))
                            u.ContactAddress.Street = userDto.ContactAddress.Street;
                        if (!string.IsNullOrEmpty(userDto.ContactAddress.Zip))
                            u.ContactAddress.Zip = userDto.ContactAddress.Zip;
                    }
                    if (userDto.DeliveryAddress != null)
                    {
                        if (!string.IsNullOrEmpty(userDto.DeliveryAddress.City))
                            u.DeliveryAddress.City = userDto.DeliveryAddress.City;
                        if (!string.IsNullOrEmpty(userDto.DeliveryAddress.Country))
                            u.DeliveryAddress.Country = userDto.DeliveryAddress.Country;
                        if (!string.IsNullOrEmpty(userDto.DeliveryAddress.State))
                            u.DeliveryAddress.State = userDto.DeliveryAddress.State;
                        if (!string.IsNullOrEmpty(userDto.DeliveryAddress.Street))
                            u.DeliveryAddress.Street = userDto.DeliveryAddress.Street;
                        if (!string.IsNullOrEmpty(userDto.DeliveryAddress.Zip))
                            u.DeliveryAddress.Zip = userDto.DeliveryAddress.Zip;
                    }
                    if (userDto.LastLogonDate != null)
                        u.LastLogonDate = userDto.LastLogonDate;
                    if (userDto.RegisteredDate != null)
                        u.RegisteredDate = userDto.RegisteredDate.Value;
                    if (!string.IsNullOrEmpty(userDto.Email))
                        u.Email = userDto.Email;

                    if (userDto.IsDisabled != null)
                    {
                        if (userDto.IsDisabled.Value)
                            u.Disable();
                        else
                            u.Enable();
                    }

                    if (!string.IsNullOrEmpty(userDto.Password))
                        u.Password = userDto.Password;
                });
        }

        public void DeleteUsers(List<UserDto> userDtos)
        {
            if (userDtos == null)
                throw new ArgumentNullException("userDtos");
            foreach (var userDto in userDtos)
            {
                User user = null;
                if (!IsEmptyGuidString(userDto.Id))
                    user = _userRepository.GetByKey(new Guid(userDto.Id));
                else if (!string.IsNullOrEmpty(userDto.UserName))
                    user = _userRepository.GetByExpression(u => u.UserName == userDto.UserName);
                else if (!string.IsNullOrEmpty(userDto.Email))
                    user = _userRepository.GetByExpression(u=>u.Email == userDto.Email);
                else
                    throw new ArgumentNullException("userDtos", "Either ID, UserName or Email should be specified.");
                var userRole = _userRoleRepository.GetBySpecification(Specification<UserRole>.Eval(ur => ur.UserId == user.Id));
                if (userRole != null)
                    _userRoleRepository.Remove(userRole);
                _userRepository.Remove(user);
            }

            RepositorytContext.Commit();
        }

        public UserDto GetUserByKey(Guid id)
        {
            var user = _userRepository.GetByKey(id);
            var userDto = Mapper.Map<User, UserDto>(user);
            return userDto;
        }

        public UserDto GetUserByEmail(string email)
        {
            if(string.IsNullOrEmpty(email))
                throw new ArgumentException("email");
            var user = _userRepository.GetByExpression(u => u.Email == email);
            var userDto = Mapper.Map<User, UserDto>(user);
            return userDto;
        }

        public UserDto GetUserByName(string userName)
        {
            if (string.IsNullOrEmpty(userName))
                throw new ArgumentException("userName");
            var user = _userRepository.GetByExpression(u => u.UserName == userName);
            var userDto = Mapper.Map<User, UserDto>(user);
            return userDto;
        }


        public IList<UserDto> GetUsers()
        {
            var users = _userRepository.GetAll();
            if (users == null)
                return null;
            var result = new List<UserDto>();
            foreach (var user in users)
            {
                var userDto = Mapper.Map<User, UserDto>(user);
                var role = _userRoleRepository.GetRoleForUser(user);
                if (role != null)
                {
                    userDto.Role = Mapper.Map<Role, RoleDto>(role);
                }

                result.Add(userDto);
            }

            return result;
        }

        public IList<RoleDto> GetRoles()
        {
            var roles = _roleRepository.GetAll();
            if (roles == null)
                return null;
            var result = roles.Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
            return result;
        }

        public RoleDto GetRoleByKey(Guid id)
        {
            return Mapper.Map<Role, RoleDto>(_roleRepository.GetByKey(id));
        }

        public IList<RoleDto> CreateRoles(List<RoleDto> roleDataObjects)
        {
            return PerformCreateObjects<List<RoleDto>, RoleDto, Role>(roleDataObjects, _roleRepository);
        }

        public IList<RoleDto> UpdateRoles(List<RoleDto> roleDataObjects)
        {
            return PerformUpdateObjects<List<RoleDto>, RoleDto, Role>(roleDataObjects,
                _roleRepository,
                roleDto => roleDto.Id,
                (r, roleDto) =>
                {
                    if (!string.IsNullOrEmpty(roleDto.Name))
                        r.Name = roleDto.Name;
                    if (!string.IsNullOrEmpty(roleDto.Description))
                        r.Description = roleDto.Description;
                });
        }

        /// <summary>
        /// 删除角色
        /// </summary>
        /// <param name="roleList">需要删除的角色ID值列表</param>
        public void DeleteRoles(List<string> roleList)
        {
            PerformDeleteObjects<Role>(roleList,
                _roleRepository,
                id =>
                {
                    var userRole = _userRoleRepository.GetBySpecification(Specification<UserRole>.Eval(ur => ur.RoleId == id));
                    if (userRole != null)
                        _userRoleRepository.Remove(userRole);
                });
        }

        public void AssignRole(Guid userId, Guid roleId)
        {
            var user = _userRepository.GetByKey(userId);
            var role = _roleRepository.GetByKey(roleId);
            _domainService.AssignRole(user, role);
        }

        public void UnassignRole(Guid userId)
        {
            var user = _userRepository.GetByKey(userId);
            _domainService.UnassignRole(user);
        }

        // 根据指定的用户名,获取该用户所属的角色
        public RoleDto GetRoleByUserName(string userName)
        {
            var user = _userRepository.GetByExpression(u=>u.UserName == userName);
            var role = _userRoleRepository.GetRoleForUser(user);
            return Mapper.Map<Role, RoleDto>(role);
        }

        public IList<OrderDto> GetOrdersForUser(string userName)
        {
            var user = _userRepository.GetByExpression(u => u.UserName == userName);
            var orders = user.Orders;
            var result = new List<OrderDto>();
            if (orders == null) return result;

            result = orders.Select(so => Mapper.Map<Order, OrderDto>(so)).ToList();
            return result;
        }
        #endregion 
    }
}

================================================
FILE: OnlineStore.Application/UserService.svc
================================================
<%@ ServiceHost Language="C#" Debug="true" Service="OnlineStore.Application.UserService" CodeBehind="UserService.svc.cs" %>


================================================
FILE: OnlineStore.Application/UserService.svc.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using OnlineStore.Infrastructure;
using OnlineStore.ServiceContracts;
using OnlineStore.ServiceContracts.ModelDTOs;

namespace OnlineStore.Application
{
    // UserService.svc, WCF服务
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class UserService : IUserService
    {
        private readonly IUserService _userServiceImp;

        public UserService()
        {
            _userServiceImp = ServiceLocator.Instance.GetService<IUserService>();
        }

        public IList<UserDto> CreateUsers(List<UserDto> userDtos)
        {
            try
            {
                return _userServiceImp.CreateUsers(userDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public bool ValidateUser(string userName, string password)
        {
            try
            {
                return _userServiceImp.ValidateUser(userName, password);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public bool DisableUser(UserDto userDto)
        {
            try
            {
                return _userServiceImp.DisableUser(userDto);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public bool EnableUser(UserDto userDto)
        {
            try
            {
                return _userServiceImp.EnableUser(userDto);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void DeleteUsers(List<UserDto> userDtos)
        {
            try
            {
                _userServiceImp.DeleteUsers(userDtos);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<UserDto> UpdateUsers(List<UserDto> userDataObjects)
        {
            try
            {
                return _userServiceImp.UpdateUsers(userDataObjects);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public UserDto GetUserByKey(Guid id)
        {
            try
            {
                return _userServiceImp.GetUserByKey(id);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public UserDto GetUserByEmail(string email)
        {
            try
            {
                return _userServiceImp.GetUserByEmail(email);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public UserDto GetUserByName(string userName)
        {
            try
            {
                return _userServiceImp.GetUserByName(userName);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<UserDto> GetUsers()
        {
            try
            {
                return _userServiceImp.GetUsers();
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<RoleDto> GetRoles()
        {
            try
            {
                return _userServiceImp.GetRoles();
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public RoleDto GetRoleByKey(Guid id)
        {
            try
            {
                return _userServiceImp.GetRoleByKey(id);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<RoleDto> CreateRoles(List<RoleDto> roleDataObjects)
        {
            try
            {
                return _userServiceImp.CreateRoles(roleDataObjects);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<RoleDto> UpdateRoles(List<RoleDto> roleDataObjects)
        {
            try
            {
                return _userServiceImp.UpdateRoles(roleDataObjects);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void DeleteRoles(List<string> roleList)
        {
            try
            {
                _userServiceImp.DeleteRoles(roleList);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void AssignRole(Guid userId, Guid roleId)
        {
            try
            {
                _userServiceImp.AssignRole(userId, roleId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public void UnassignRole(Guid userId)
        {
            try
            {
                _userServiceImp.UnassignRole(userId);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public RoleDto GetRoleByUserName(string userName)
        {
            try
            {
                return _userServiceImp.GetRoleByUserName(userName);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }

        public IList<OrderDto> GetOrdersForUser(string userName)
        {
            try
            {
                return _userServiceImp.GetOrdersForUser(userName);
            }
            catch (Exception ex)
            {
                throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
            }
        }
    }
}


================================================
FILE: OnlineStore.Application/Web.Debug.config
================================================
<?xml version="1.0" encoding="utf-8"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

================================================
FILE: OnlineStore.Application/Web.Release.config
================================================
<?xml version="1.0" encoding="utf-8"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

================================================
FILE: OnlineStore.Application/Web.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework" />
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    <section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching" />
  </configSections>
  
  <!-- Entity Framework 配置信息-->
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(LocalDb)\v11.0; Initial Catalog=OnlineStore; Integrated Security=True; Connect Timeout=120; MultipleActiveResultSets=True; AttachDBFilename=|DataDirectory|\OnlineStore.mdf" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
 
  <!--Unity的配置信息-->
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
    <container>
      <extension type="Interception" />
      
       <!--Cache Provider-->
      <register type="OnlineStore.Infrastructure.Caching.ICacheProvider, OnlineStore.Infrastructure" mapTo="OnlineStore.Infrastructure.Caching.EntLibCacheProvider, OnlineStore.Infrastructure" />
      
      <!--仓储接口的注册-->
      <register type="OnlineStore.Domain.Repositories.IRepositoryContext, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.EntityFrameworkRepositoryContext, OnlineStore.Repositories">
          <lifetime type="singleton" />
      </register>
      <register type="OnlineStore.Domain.Repositories.IProductRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.ProductRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.ICategoryRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.CategoryRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IProductCategorizationRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.ProductCategorizationRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IUserRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.UserRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IShoppingCartRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.ShoppingCartRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IShoppingCartItemRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.ShoppingCartItemRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IOrderRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.OrderRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IUserRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.UserRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IUserRoleRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.UserRoleRepository, OnlineStore.Repositories" />
      <register type="OnlineStore.Domain.Repositories.IRoleRepository, OnlineStore.Domain" mapTo="OnlineStore.Repositories.EntityFramework.RoleRepository, OnlineStore.Repositories" />
      
       <!--Domain Services-->
      <register type="OnlineStore.Domain.Services.IDomainService, OnlineStore.Domain" mapTo="OnlineStore.Domain.Services.DomainService, OnlineStore.Domain" />
      <!--应用服务的注册-->
      <register type="OnlineStore.ServiceContracts.IProductService, OnlineStore.ServiceContracts" mapTo="OnlineStore.Application.ServiceImplementations.ProductServiceImp, OnlineStore.Application">
        <!--注入AOP功能的实现-->
        <interceptor type="InterfaceInterceptor" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.CachingBehavior, OnlineStore.Infrastructure" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.ExceptionLoggingBehavior, OnlineStore.Infrastructure" />
      </register>

      <register type="OnlineStore.ServiceContracts.IOrderService, OnlineStore.ServiceContracts" mapTo="OnlineStore.Application.ServiceImplementations.OrderServiceImp, OnlineStore.Application">
        <!--注入AOP功能的实现-->
        <interceptor type="InterfaceInterceptor" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.CachingBehavior, OnlineStore.Infrastructure" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.ExceptionLoggingBehavior, OnlineStore.Infrastructure" />
      </register>
      <register type="OnlineStore.ServiceContracts.IUserService, OnlineStore.ServiceContracts" mapTo="OnlineStore.Application.ServiceImplementations.UserServiceImp, OnlineStore.Application">
        <!--注入AOP功能的实现-->
        <interceptor type="InterfaceInterceptor" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.CachingBehavior, OnlineStore.Infrastructure" />
        <interceptionBehavior type="OnlineStore.Infrastructure.InterceptionBehaviors.ExceptionLoggingBehavior, OnlineStore.Infrastructure" />
      </register>

      <!--Domain Event Handlers-->
      <register type="OnlineStore.Domain.Events.IDomainEventHandler`1[[OnlineStore.Domain.Events.OrderDispatchedEvent, OnlineStore.Domain]], OnlineStore.Domain" mapTo="OnlineStore.Domain.Events.EventHandlers.OrderDispatchedEventHandler, OnlineStore.Domain" name="OrderDispatchedEventHandler" />
      <register type="OnlineStore.Domain.Events.IDomainEventHandler`1[[OnlineStore.Domain.Events.OrderConfirmedEvent, OnlineStore.Domain]], OnlineStore.Domain" mapTo="OnlineStore.Domain.Events.EventHandlers.OrderConfirmedEventHandler, OnlineStore.Domain" name="OrderConfirmedEventHandler" />
      
      <!--Event Handlers-->
      <register name="orderSendEmailHandler" type="OnlineStore.Events.IEventHandler`1[[OnlineStore.Domain.Events.OrderDispatchedEvent, OnlineStore.Domain]], OnlineStore.Events" mapTo="OnlineStore.Events.Handlers.SendEmailHandler, OnlineStore.Events.Handlers" />
     
      <!--Event Aggregator-->
      <register type="OnlineStore.Events.IEventAggregator, OnlineStore.Events" mapTo="OnlineStore.Events.EventAggregator, OnlineStore.Events">
        <constructor>
          <param name="handlers">
            <array>
              <dependency name="orderSendEmailHandler" type="OnlineStore.Events.IEventHandler`1[[OnlineStore.Domain.Events.OrderDispatchedEvent, OnlineStore.Domain]], OnlineStore.Events" />
            </array>
          </param>
        </constructor>
      </register>
      
      <!--Event Bus-->
      <!--<register type="OnlineStore.Events.Bus.IEventBus, OnlineStore.Events" mapTo="OnlineStore.Events.Bus.EventBus, OnlineStore.Events">
        <lifetime type="singleton" />
      </register>-->
      
      <!--注入MsmqEventBus-->
      <register type="OnlineStore.Events.Bus.IEventBus, OnlineStore.Events"
                mapTo="OnlineStore.Events.Bus.MsmqEventBus, OnlineStore.Events">
        <lifetime type="singleton" />
        <constructor>
          <param name="path" value=".\Private$\OnlineStoreQueue" />
        </constructor>
      </register>
    </container>
  </unity>
  <!--END: Unity-->
  
  <!--BEGIN: log4net-->
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\onlinestore.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <logger name="OnlineStore.Logger">
      <level value="INFO" />
      <appender-ref ref="RollingFileAppender" />
    </logger>
  </log4net>
  <!--END: log4net-->

  <!--BEGIN: Caching-->
  <cachingConfiguration defaultCacheManager="OnlineStoreCacheManager">
    <cacheManagers>
      <add name="OnlineStoreCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching" expirationPollFrequencyInSeconds="600" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore" />
    </cacheManagers>
    <backingStores>
      <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching" name="NullBackingStore" />
    </backingStores>
  </cachingConfiguration>
  <!--END: Caching-->
  
  <system.net>
    <mailSettings>
      <smtp from="mytest1989@sina.com">
        <network host="smtp.sina.com" port="25" userName="mytest1989@sina.com" defaultCredentials="false" password="test123" enableSsl="false" />
      </smtp>
    </mailSettings>
  </system.net>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5.1" />
  </system.web>
  <!--WCF 服务的配置信息-->
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="OnlineStore.Application.ServiceImplementations.ProductServiceImp" behaviorConfiguration="">
        <endpoint address="" binding="wsHttpBinding" contract="OnlineStore.ServiceContracts.IProductService" />
        <!--<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />-->
      </service>

      <service name="OnlineStore.Application.ServiceImplementations.OrderServiceImp" behaviorConfiguration="">
        <endpoint address="" binding="wsHttpBinding" contract="OnlineStore.ServiceContracts.IOrderService" />
        <!--<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />-->
      </service>
    
     <service name="OnlineStore.Application.ServiceImplementations.UserServiceImp" behaviorConfiguration="">
        <endpoint address="" binding="wsHttpBinding" contract="OnlineStore.ServiceContracts.IUserService" />
        <!--<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />-->
      </service>
    </services>
    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true" />
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.EnterpriseLibrary.Common"/>
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.ServiceLocation" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity.Interception" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

================================================
FILE: OnlineStore.Application/packages.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AutoMapper" version="3.3.1" targetFramework="net45" />
  <package id="CommonServiceLocator" version="1.3" targetFramework="net45" />
  <package id="EnterpriseLibrary.Caching" version="5.0.505.0" targetFramework="net45" />
  <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net45" />
  <package id="log4net" version="2.0.3" targetFramework="net45" />
  <package id="Unity" version="3.5.1404.0" targetFramework="net45" />
  <package id="Unity.Interception" version="3.5.1404.0" targetFramework="net45" />
</packages>

================================================
FILE: OnlineStore.Domain/DomainException.cs
================================================
using System;
using System.Runtime.Serialization;

namespace OnlineStore.Domain
{
    public class DomainException : Exception
    {
        #region Ctor
        public DomainException() : base()
        {
        }

        public DomainException(string message) : base(message)
        {
        }
        public DomainException(string message, Exception innerException) : base(message, innerException) { }
       
        public DomainException(string format, params object[] args) : base(string.Format(format, args)) { }
       
        protected DomainException(SerializationInfo info, StreamingContext context) : base(info, context) { }
        
        #endregion 
    }
}

================================================
FILE: OnlineStore.Domain/Events/DomainEvent.cs
================================================
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using OnlineStore.Events;
using OnlineStore.Infrastructure;

namespace OnlineStore.Domain.Events
{
    [SuppressMessage("ReSharper", "AccessToForEachVariableInClosure")]
    public class DomainEvent : IDomainEvent
    {
        #region Private Fields
        private readonly IEntity _source;
        private Guid _id = Guid.NewGuid();
        private DateTime _timeStamp = DateTime.UtcNow;

        #endregion 

        #region Ctor

        public DomainEvent()
        {
        }

        public DomainEvent(IEntity source)
        {
            _source = source;
        }

        #endregion

        #region IDomainEvent Members
        public IEntity Source
        {
            get { return _source; }
        }

        public Guid Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public DateTime TimeStamp
        {
            get { return _timeStamp; }
            set { _timeStamp = value; }
        }
        #endregion 

        #region Public Static Methods

        public static void Handle<TDomainEvent>(TDomainEvent domainEvent)
            where TDomainEvent : class, IDomainEvent
        {
            // 找到对应的事件处理器来对事件进行处理
            var handlers = ServiceLocator.Instance.ResolveAll<IDomainEventHandler<TDomainEvent>>();
            foreach (var handler in handlers)
            {
                if (handler.GetType().IsDefined(typeof(HandlesAsynchronouslyAttribute), false))
                    Task.Factory.StartNew(() => handler.Handle(domainEvent));
                else
                    handler.Handle(domainEvent);
            }
        }

        public static void Handle<TDomainEvent>(TDomainEvent domainEvent, Action<TDomainEvent, bool, Exception> callback, TimeSpan? timeout = null)
            where TDomainEvent : class, IDomainEvent
        {
            var handlers = ServiceLocator.Instance.ResolveAll<IDomainEventHandler<TDomainEvent>>();
            if (handlers != null && handlers.Any())
            {
                var tasks = new List<Task>();
                try
                {
                    foreach (var handler in handlers)
                    {
                        if (handler.GetType().IsDefined(typeof(HandlesAsynchronouslyAttribute), false))
                        {
                            tasks.Add(Task.Factory.StartNew(() => handler.Handle(domainEvent)));
                        }
                        else
                            handler.Handle(domainEvent);
                    }
                    if (tasks.Count > 0)
                    {
                        if (timeout == null)
                            Task.WaitAll(tasks.ToArray());
                        else
                            Task.WaitAll(tasks.ToArray(), timeout.Value);
                    }
                    callback(domainEvent, true, null);
                }
                catch (Exception ex)
                {
                    callback(domainEvent, false, ex);
                }
            }
            else
                callback(domainEvent, false, null);
        }
        #endregion
    }
}

================================================
FILE: OnlineStore.Domain/Events/EventHandlers/OrderConfirmedEventHandler.cs
================================================
using OnlineStore.Domain.Model;
using OnlineStore.Events.Bus;

namespace OnlineStore.Domain.Events.EventHandlers
{
    // 订单确认事件处理器
    public class OrderConfirmedEventHandler : IDomainEventHandler<OrderConfirmedEvent>
    {
        private readonly IEventBus _bus;

        public OrderConfirmedEventHandler(IEventBus bus)
        {
            _bus = bus;
        }

        #region IDomainEventHandler Member
        // 事件处理器只对事件源的状态进行更新,事件状态的持久化而是在EventBus中进行处理的。
        public void Handle(OrderConfirmedEvent @event)
        {
            // 获得事件源对象
            var order = @event.Source as Order;
            // 更新事件源对象的属性
            if (order == null) return;

            order.DeliveredDate = @event.ConfirmedDate;
            order.Status = OrderStatus.Delivered;

            // 把事件推送到EventBus中进行进一步处理
            _bus.Publish<OrderConfirmedEvent>(@event);
        }
        #endregion 
    }
}

================================================
FILE: OnlineStore.Domain/Events/EventHandlers/OrderDispatchedEventHandler.cs
================================================
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.Events.Bus;

namespace OnlineStore.Domain.Events.EventHandlers
{
    // 发货事件处理器
    public class OrderDispatchedEventHandler : IDomainEventHandler<OrderDispatchedEvent>
    {
        private readonly IEventBus _bus;
       

        public OrderDispatchedEventHandler(IEventBus bus)
        {
            _bus = bus;
        }

        public void Handle(OrderDispatchedEvent @event)
        {
            // 获得事件源对象
            var order = @event.Source as Order;
            // 更新事件源对象的属性
            if (order == null) return;

            order.DispatchedDate = @event.DispatchedDate;
            order.Status = OrderStatus.Dispatched;

            // 这里把领域事件认为是一种消息,推送到EventBus中进行进一步处理。
            _bus.Publish<OrderDispatchedEvent>(@event);
        }
    }
}

================================================
FILE: OnlineStore.Domain/Events/IDomainEvent.cs
================================================
using OnlineStore.Events;

namespace OnlineStore.Domain.Events
{
    public interface IDomainEvent : IEvent
    {
        // 获取产生领域事件的事件源对象
        IEntity Source { get; }
    }
}

================================================
FILE: OnlineStore.Domain/Events/IDomainEventHandler.cs
================================================
using OnlineStore.Events;

namespace OnlineStore.Domain.Events
{
    /// <summary>
    /// 领域事件处理器
    /// </summary>
    public interface IDomainEventHandler<in TDomainEvent> : IEventHandler<TDomainEvent>
        where TDomainEvent :class, IDomainEvent
    {
         
    }
}

================================================
FILE: OnlineStore.Domain/Events/OrderConfirmedEvent.cs
================================================
using System;

namespace OnlineStore.Domain.Events
{
    [Serializable]
    public class OrderConfirmedEvent : DomainEvent
    {
        #region Ctor
        public OrderConfirmedEvent() { }
        public OrderConfirmedEvent(IEntity source) : base(source) { }
        #endregion

        #region Public Properties
        /// <summary>
        /// 获取或设置订单确认的日期。
        /// </summary>
        public DateTime ConfirmedDate { get; set; }
        public string UserEmailAddress { get; set; }
        public Guid OrderId { get; set; }
        #endregion 
    }
}

================================================
FILE: OnlineStore.Domain/Events/OrderDispatchedEvent.cs
================================================
using System;

namespace OnlineStore.Domain.Events
{
    [Serializable]
    public class OrderDispatchedEvent : DomainEvent
    {
        #region Ctor
        public OrderDispatchedEvent() { }
        public OrderDispatchedEvent(IEntity source) : base(source) { }
        #endregion

        #region Public Properties
        /// <summary>
        /// 获取或设置订单发货的日期。
        /// </summary>
        public DateTime DispatchedDate { get; set; }
        public string UserEmailAddress { get; set; }
        public Guid OrderId { get; set; }
        #endregion
    }
}

================================================
FILE: OnlineStore.Domain/IAggregateRoot.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.Domain
{
    // 聚合根接口,继承于该接口的对象是外部唯一操作的对象
    public interface IAggregateRoot : IEntity
    {
    }
}


================================================
FILE: OnlineStore.Domain/IEntity.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.Domain
{
    // 领域实体接口
    public interface IEntity
    {
        // 当前领域实体的全局唯一标识
        Guid Id { get; }
    }
}


================================================
FILE: OnlineStore.Domain/Model/Address.cs
================================================

namespace OnlineStore.Domain.Model
{
    // 值对象 
    public class Address
    {
        #region Properties
        // 国家
        public string Country { get; set; }

        //省份
        public string State { get; set; }

        // 市
        public string City { get; set; }

        public string Street { get; set; }

        public string Zip { get; set; }
        #endregion

        #region Object Member
        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            if (ReferenceEquals(this, obj))
                return true;
            Address another = obj as Address;
            if (another == null)
                return false;

            return this.Country.Equals(another.Country) &&
                this.State.Equals(another.State) &&
                this.City.Equals(another.City) &&
                this.Street.Equals(another.Street) &&
                this.Zip.Equals(another.Zip);
        }

        public override int GetHashCode()
        {
            return this.Country.GetHashCode() ^
                this.State.GetHashCode() ^
                this.City.GetHashCode() ^
                this.Street.GetHashCode() ^
                this.Zip.GetHashCode();
        }

        public override string ToString()
        {
            return string.Format("{0} {1}, {2}, {3}, {4}", Zip, Street, City, State, Country);
        }
        #endregion

        #region Public Static Operator Overrides

        public static bool operator ==(Address a, Address b)
        {
            if (a == null)
            {
                return b == null;
            }
            return a.Equals(b);
        }

        public static bool operator !=(Address a, Address b)
        {
            return !(a == b);
        }
        #endregion
    }
}


================================================
FILE: OnlineStore.Domain/Model/AggregateRoot.cs
================================================
using System;

namespace OnlineStore.Domain.Model
{
    public abstract class AggregateRoot : IAggregateRoot
    {
        public Guid Id
        {
            get;
            set;
        }

        #region Object Member

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            if (ReferenceEquals(this, obj))
                return true;
            IAggregateRoot ar = obj as IAggregateRoot;
            if (ar == null)
                return false;
            return this.Id == ar.Id;
        }

        public override int GetHashCode()
        {
            return this.Id.GetHashCode();
        }

        #endregion 
    }
}


================================================
FILE: OnlineStore.Domain/Model/Category.cs
================================================

namespace OnlineStore.Domain.Model
{
    // 类别类
    public class Category : AggregateRoot
    {
        public string Name { get; set; }

        public string Description { get; set; }

        public override string ToString()
        {
            return this.Name;
        }
    }
}


================================================
FILE: OnlineStore.Domain/Model/Order.cs
================================================

using System;
using System.Collections.Generic;
using System.Linq;
using OnlineStore.Domain.Events;

namespace OnlineStore.Domain.Model
{
    public class Order : AggregateRoot
    {
        private List<OrderItem> _orderItems = new List<OrderItem>();

        #region Public Properties
        // 获取或设置订单的状态
        public OrderStatus Status { get; set; }

        /// <summary>
        /// 获取或设置订单的创建日期
        /// </summary>
        public DateTime CreatedDate { get; set; }

        /// <summary>
        /// 获取或设置订单的发货日期
        /// </summary>
        public DateTime? DispatchedDate { get; set; }

        /// <summary>
        /// 获取或设置订单的派送日期
        /// </summary>
        public DateTime? DeliveredDate { get; set; }

        public virtual List<OrderItem> OrderItems
        { 
            get 
            {
                return _orderItems; 
            }
            set
            {
                _orderItems = value;
            }
        }

        public virtual User User { get; set; }

        public Address DeliveryAddress
        { 
            get 
            { 
                return User.DeliveryAddress;
            } 
        }

        // 在严格的业务系统中,金额往往以Money模式实现。有关Money模式,请参见:http://martinfowler.com/eaaCatalog/money.html
        public decimal Subtotal
        {
            get
            {
                return this.OrderItems.Sum(p => p.ItemAmout);
            }
        }

        #endregion 

        #region Ctor
        public Order()
        {
            CreatedDate = DateTime.Now;
            Status = OrderStatus.Created;
        }

        #endregion 

        #region Public Methods
        /// <summary>
        /// 当客户完成收货后,对销售订单进行确认。
        /// </summary>
        public void Confirm()
        {
            // 处理领域事件
            DomainEvent.Handle<OrderConfirmedEvent>(new OrderConfirmedEvent(this) { ConfirmedDate = DateTime.Now, OrderId = this.Id, UserEmailAddress = this.User.Email });
        }

        /// <summary>
        /// 处理发货。
        /// </summary>
        public void Dispatch()
        {
            // 处理领域事件
            DomainEvent.Handle<OrderDispatchedEvent>(new OrderDispatchedEvent(this) { DispatchedDate = DateTime.Now, OrderId = this.Id, UserEmailAddress = this.User.Email });
        }
        #endregion
    }
}


================================================
FILE: OnlineStore.Domain/Model/OrderItem.cs
================================================
using System;

namespace OnlineStore.Domain.Model
{
    public class OrderItem : IEntity
    {
        #region IEnity Member
        public Guid Id { get; set; }
        #endregion 

        public int Quantity { get; set; }
        public virtual Product Product { get; set; }

        // 包含当前订单项的订单对象
        public virtual Order Order { get; set; }

        public decimal ItemAmout 
        {
            get
            {
                return this.Product.UnitPrice * this.Quantity;
            }
        }

        #region Object Member
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(this, obj))
                return true;
            if (obj == null)
                return false;
            OrderItem other = obj as OrderItem;
            if ((object)other == null)
                return false;
            return this.Id == other.Id;
        }

        public override int GetHashCode()
        {
            return this.Id.GetHashCode();
        }

        #endregion 

        #region Public Static Operator Overrides
        public static bool operator ==(OrderItem a, OrderItem b)
        {
            if ((object)a == null)
            {
                return (object)b == null;
            }
            return a.Equals(b);
        }

        public static bool operator !=(OrderItem a, OrderItem b)
        {
            return !(a == b);
        }
        #endregion 
    }
}


================================================
FILE: OnlineStore.Domain/Model/OrderStatus.cs
================================================

namespace OnlineStore.Domain.Model
{
    public enum OrderStatus
    {
        Created = 0, // 订单已被创建
        Paid, // 订单已付款
        Picked, // 订单已仓库拣货
        Dispatched, // 已发货
        Delivered // 已派送
    }
}


================================================
FILE: OnlineStore.Domain/Model/Product.cs
================================================

namespace OnlineStore.Domain.Model
{
    // 商品类
    public class Product : AggregateRoot
    {
        public string Name { get; set; }

        public string Description { get; set; }

        public decimal UnitPrice { get; set; }

        public string ImageUrl { get; set; }

        public bool IsNew{ get; set; }

        public override string ToString()
        {
            return Name;
        }
    }
}


================================================
FILE: OnlineStore.Domain/Model/ProductCategorization.cs
================================================
using System;

namespace OnlineStore.Domain.Model
{
    public class ProductCategorization : AggregateRoot
    {
        public ProductCategorization()
        { }

        public ProductCategorization(Guid productId, Guid categoryId)
        {
            this.CategoryId = categoryId;
            this.ProductId = productId;
        }

        public Guid CategoryId { get; set; }

        public Guid ProductId { get;  set; }

        public override string ToString()
        {
            return string.Format("CategoryID: {0}, ProductID: {1}", this.CategoryId, this.ProductId);
        }

        // 通过商品对象和分类对象来创建商品分类对象
        public static ProductCategorization CreateCategorization(Product product, Category category)
        {
            return new ProductCategorization(product.Id, category.Id);
        }
    }
}


================================================
FILE: OnlineStore.Domain/Model/Role.cs
================================================

namespace OnlineStore.Domain.Model
{
    public class Role : AggregateRoot
    {
        public string Name { get; set; }

        public string Description { get; set; }
    }
}


================================================
FILE: OnlineStore.Domain/Model/ShoppingCart.cs
================================================

namespace OnlineStore.Domain.Model
{
    public class ShoppingCart : AggregateRoot
    {
        public User User { get; set; }
    }
}


================================================
FILE: OnlineStore.Domain/Model/ShoppingCartItem.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.Domain.Model
{
    public class ShoppingCartItem : AggregateRoot
    {
        public int Quantity { get; set; }

        public virtual Product Product { get; set; }

        public virtual ShoppingCart ShoopingCart { get; set; }

        public decimal ItemAmount
        {
            get
            {
                return this.Product.UnitPrice * this.Quantity;
            }
        }

        #region  Public Methods

        // 将当前的购物车中的项目转换为订单项
        public OrderItem ConvertToOrderItem()
        {
            var orderItem = new OrderItem
            {
                Id = Guid.NewGuid(), 
                Product = this.Product, 
                Quantity = this.Quantity
            };
            return orderItem;
        }

        public void UpdateQuantity(int quantity)
        {
            this.Quantity = quantity;
        }
        #endregion 
    }
}


================================================
FILE: OnlineStore.Domain/Model/User.cs
================================================

using System;
using System.Collections.Generic;

namespace OnlineStore.Domain.Model
{
    // 用户聚合根
    public class User : AggregateRoot
    {
        public string UserName { get; set; }
        public string Password { get; set; }

        public string Email { get; set; }

        public string PhoneNumber { get; set; }

        public bool IsDisabled { get; set; }

        public DateTime RegisteredDate { get; set; }

        public DateTime? LastLogonDate { get; set; }

        public string Contact { get; set; }
        //用户的联系地址
        public Address ContactAddress { get; set; }

        //用户的发货地址
        public Address DeliveryAddress { get; set; }

        public IEnumerable<Order> Orders 
        {
            get
            {
                IEnumerable<Order> result = null;
                //DomainEvent.Handle<GetUserOrdersEvent>(new GetUserOrdersEvent(this),
                //    (e, ret, exc) =>
                //    {
                //        result = e.Orders;
                //    });
                return result;
            }
        }

        public override string ToString()
        {
            return this.UserName;
        }

        #region Public Methods

        public void Disable()
        {
            this.IsDisabled = true;
        }

        public void Enable()
        {
            this.IsDisabled = false;
        }

        // 为当前用户创建购物篮。
        public ShoppingCart CreateShoppingCart()
        {
            var shoppingCart = new ShoppingCart { User = this };
            return shoppingCart;
        }
        #endregion 
    }
}


================================================
FILE: OnlineStore.Domain/Model/UserRole.cs
================================================
using System;

namespace OnlineStore.Domain.Model
{
    public class UserRole : AggregateRoot
    {
        public Guid UserId { get; set; }

        public Guid RoleId { get; set; }

        public static UserRole CreateUserRole(User user, Role role)
        {
            return new UserRole() { UserId = user.Id, RoleId = role.Id };
        }
    }
}


================================================
FILE: OnlineStore.Domain/OnlineStore.Domain.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{1AE7732F-2FAF-407E-89DD-BAD81C4132E0}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>OnlineStore.Domain</RootNamespace>
    <AssemblyName>OnlineStore.Domain</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Events\DomainEvent.cs" />
    <Compile Include="DomainException.cs" />
    <Compile Include="Events\EventHandlers\OrderConfirmedEventHandler.cs" />
    <Compile Include="Events\EventHandlers\OrderDispatchedEventHandler.cs" />
    <Compile Include="Events\IDomainEvent.cs" />
    <Compile Include="Events\IDomainEventHandler.cs" />
    <Compile Include="Events\OrderConfirmedEvent.cs" />
    <Compile Include="Events\OrderDispatchedEvent.cs" />
    <Compile Include="IAggregateRoot.cs" />
    <Compile Include="IEntity.cs" />
    <Compile Include="Model\Address.cs" />
    <Compile Include="Model\AggregateRoot.cs" />
    <Compile Include="Model\Category.cs" />
    <Compile Include="Model\Order.cs" />
    <Compile Include="Model\OrderItem.cs" />
    <Compile Include="Model\OrderStatus.cs" />
    <Compile Include="Model\Product.cs" />
    <Compile Include="Model\ProductCategorization.cs" />
    <Compile Include="Model\Role.cs" />
    <Compile Include="Model\ShoppingCart.cs" />
    <Compile Include="Model\ShoppingCartItem.cs" />
    <Compile Include="Model\User.cs" />
    <Compile Include="Model\UserRole.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Repositories\ICategoryRepository.cs" />
    <Compile Include="Repositories\IOrderRepository.cs" />
    <Compile Include="Repositories\IProductCategorizationRepository.cs" />
    <Compile Include="Repositories\IProductRepository.cs" />
    <Compile Include="Repositories\IRepository.cs" />
    <Compile Include="Repositories\IRepositoryContext.cs" />
    <Compile Include="Repositories\IRoleRepository.cs" />
    <Compile Include="Repositories\IShoppingCartItemRepository.cs" />
    <Compile Include="Repositories\IShoppingCartRepository.cs" />
    <Compile Include="Repositories\IUserRepository.cs" />
    <Compile Include="Repositories\IUserRoleRepository.cs" />
    <Compile Include="Services\DomainService.cs" />
    <Compile Include="Services\IDomainService.cs" />
    <Compile Include="Specifications\AnySpecification.cs" />
    <Compile Include="Specifications\ExpressionSpecification.cs" />
    <Compile Include="Specifications\ISpecification.cs" />
    <Compile Include="Specifications\ParameterReplacer.cs" />
    <Compile Include="Repositories\SortOrder.cs" />
    <Compile Include="Specifications\SpecExprExtensions.cs" />
    <Compile Include="Specifications\Specification.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\OnlineStore.Events\OnlineStore.Events.csproj">
      <Project>{f165abc2-f76a-4fd7-8675-833264855221}</Project>
      <Name>OnlineStore.Events</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Infrastructure\OnlineStore.Infrastructure.csproj">
      <Project>{9dde33cc-cf3c-436e-8a5f-4e1f0f8b603e}</Project>
      <Name>OnlineStore.Infrastructure</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: OnlineStore.Domain/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OnlineStore.Domain")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OnlineStore.Domain")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2e3e41cc-5c75-45ad-aac8-23bf93d1abe2")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: OnlineStore.Domain/Repositories/ICategoryRepository.cs
================================================
using System.Collections;
using System.Collections.Generic;
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    public interface ICategoryRepository : IRepository<Category>
    {
       
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IOrderRepository.cs
================================================
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    // 订单仓储接口
    public interface IOrderRepository : IRepository<Order>
    {
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IProductCategorizationRepository.cs
================================================
using System.Collections.Generic;
using OnlineStore.Domain.Model;
using OnlineStore.Infrastructure;

namespace OnlineStore.Domain.Repositories
{
    public interface IProductCategorizationRepository : IRepository<ProductCategorization>
    {
        // 获取指定分类下的所有商品信息
        IEnumerable<Product> GetProductsForCategory(Category category);
        
        /// <summary>
        /// 以分页的方式,获取指定分类下的所有商品信息
        /// </summary>
        /// <param name="category">指定的商品分类</param>
        /// <param name="pageNumber">所请求的分页页码</param>
        /// <param name="pageSize">所请求的页大小</param>
        /// <returns>指定分类下的某页的商品信息</returns>
        PagedResult<Product> GetProductsForCategoryWithPagination(Category category, int pageNumber, int pageSize);

        /// <summary>
        /// 获取商品所属的商品分类。
        /// </summary>
        /// <param name="product">商品信息。</param>
        /// <returns>商品分类。</returns>
        Category GetCategoryForProduct(Product product);
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IProductRepository.cs
================================================
using OnlineStore.Domain.Model;
using System;
using System.Collections.Generic;

namespace OnlineStore.Domain.Repositories
{
    public interface IProductRepository : IRepository<Product>
    {
        IEnumerable<Product> GetNewProducts(int count = 0);
    }
}


================================================
FILE: OnlineStore.Domain/Repositories/IRepository.cs
================================================
using OnlineStore.Domain.Specifications;
using OnlineStore.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.Domain.Repositories
{
    // 仓储接口
    public interface IRepository<TAggregateRoot> 
        where TAggregateRoot :class, IAggregateRoot
    {
        #region Methods
        void Add(TAggregateRoot aggregateRoot);

        // 根据聚合根的ID值,从仓储中读取聚合根
        TAggregateRoot GetByKey(Guid key);

        TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot> spec);

        TAggregateRoot GetByExpression(Expression<Func<TAggregateRoot, bool>> expression);

        // 读取所有聚合根。
        IEnumerable<TAggregateRoot> GetAll();

        // 以指定的排序字段和排序方式,从仓储中读取所有聚合根。
        IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dynamic>> sortPredicate, SortOrder sortOrder);

        //  根据指定的规约获取聚合根
        IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> specification);

        // 根据指定的规约,以指定的排序字段和排序方式,从仓储中读取聚合根
        IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> specification, Expression<Func<TAggregateRoot, dynamic>> sortPredicate, SortOrder sortOrder);

        // 返回一个值,该值表示符合指定规约条件的聚合根是否存在。
        bool Exists(ISpecification<TAggregateRoot> specification);
        
        void Remove(TAggregateRoot aggregateRoot);

        void Update(TAggregateRoot aggregateRoot);

        #region 分页支持
        #endregion 
        PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dynamic>> sortPredicate, 
            SortOrder sortOrder, int pageNumber, int pageSize);

        PagedResult<TAggregateRoot> GetAll(
            ISpecification<TAggregateRoot> specification, 
            Expression<Func<TAggregateRoot, dynamic>> sortPredicate, 
            SortOrder sortOrder, int pageNumber, int pageSize);

        PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dynamic>> sortPredicate, 
            SortOrder sortOrder, int pageNumber, int pageSize, 
            params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);

        PagedResult<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> specification, 
            Expression<Func<TAggregateRoot, dynamic>> sortPredicate, 
            SortOrder sortOrder, int pageNumber, int pageSize, 
            params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);
        #endregion
        #region 饥饿加载方式

        TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot> specification, params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);
        IEnumerable<TAggregateRoot> GetAll(params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);

        IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dynamic>> sortPredicate, SortOrder sortOrder, params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);

        IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> specification, params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);

        IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> specification, Expression<Func<TAggregateRoot, dynamic>> sortPredicate, SortOrder sortOrder, params Expression<Func<TAggregateRoot, dynamic>>[] eagerLoadingProperties);
        #endregion
    }
}


================================================
FILE: OnlineStore.Domain/Repositories/IRepositoryContext.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OnlineStore.Infrastructure;

namespace OnlineStore.Domain.Repositories
{
    // 仓储上下文接口
    // 这里把传统的IUnitOfWork接口中方法分别在2个接口定义:一个是IUnitOfWork,另一个就是该接口
    public interface IRepositoryContext : IUnitOfWork
    {
        // 用来标识仓储上下文
        Guid Id { get; }

        void RegisterNew<TAggregateRoot>(TAggregateRoot entity) 
            where TAggregateRoot : class, IAggregateRoot;

        void RegisterModified<TAggregateRoot>(TAggregateRoot entity)
            where TAggregateRoot : class, IAggregateRoot;

        void RegisterDeleted<TAggregateRoot>(TAggregateRoot entity)
            where TAggregateRoot : class, IAggregateRoot;
    }
}


================================================
FILE: OnlineStore.Domain/Repositories/IRoleRepository.cs
================================================
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    public interface IRoleRepository : IRepository<Role>
    {
         
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IShoppingCartItemRepository.cs
================================================
using System.Collections.Generic;
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    public interface IShoppingCartItemRepository : IRepository<ShoppingCartItem>
    {
        ShoppingCartItem FindItem(ShoppingCart shoppingCart, Product product);
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IShoppingCartRepository.cs
================================================
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    public interface IShoppingCartRepository : IRepository<ShoppingCart>
    {
        
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IUserRepository.cs
================================================
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Specifications;

namespace OnlineStore.Domain.Repositories
{
    public interface IUserRepository : IRepository<User>
    {
        bool CheckPassword(string userName, string password);
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/IUserRoleRepository.cs
================================================
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Repositories
{
    public interface IUserRoleRepository : IRepository<UserRole>
    {
        /// <summary>
        /// 根据指定的用户,获取该用户所属的角色
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        Role GetRoleForUser(User user);
    }
}

================================================
FILE: OnlineStore.Domain/Repositories/SortOrder.cs
================================================
namespace OnlineStore.Domain.Repositories
{
    public enum SortOrder
    {
        UnSpecified = -1,
        Ascending = 0,
        Descending = 1
    }
}

================================================
FILE: OnlineStore.Domain/Services/DomainService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using OnlineStore.Domain.Model;
using OnlineStore.Domain.Repositories;
using OnlineStore.Domain.Specifications;

namespace OnlineStore.Domain.Services
{
    // 领域服务类型
    // 牵涉到多个实体的操作可以把这些操作封装到领域服务里
    public class DomainService : IDomainService
    {
        #region Private Fields
        private readonly IRepositoryContext _repositoryContext;
        private readonly IShoppingCartItemRepository _shoppingCartItemRepository;
        private readonly IOrderRepository _orderRepository;
        private readonly IProductCategorizationRepository _productCategorizationRepository;
        private readonly IUserRoleRepository _userRoleRepository;
        #endregion

        #region Ctor

        public DomainService(IRepositoryContext repositoryContext,
            IOrderRepository orderRepository, 
            IShoppingCartItemRepository shoppingCartItemRepository, 
            ICategoryRepository categoryRepository, 
            IProductCategorizationRepository productCategorizationRepository,
            IProductRepository productRepository, 
            IUserRepository userRepository, 
            IRoleRepository roleRepository, 
            IUserRoleRepository userRoleRepository)
        {
            _repositoryContext = repositoryContext;
            _orderRepository = orderRepository;
            _shoppingCartItemRepository = shoppingCartItemRepository;
            _productCategorizationRepository = productCategorizationRepository;
            _userRoleRepository = userRoleRepository;
        }

        #endregion 
       
        #region IDomainService
        /// <summary>
        /// 创建订单,涉及到的操作有2个:1. 把购物车中的项中购物车移除; 2.创建一个订单。
        /// 这两个操作必须同时完成或失败。
        /// </summary>
        /// <param name="user"></param>
        /// <param name="shoppingCart"></param>
        /// <returns></returns>
        public Order CreateOrder(User user, ShoppingCart shoppingCart)
        {
            var order = new Order();
            var shoppingCartItems =
                _shoppingCartItemRepository.GetAll(
                    new ExpressionSpecification<ShoppingCartItem>(s => s.ShoopingCart.Id == shoppingCart.Id));
            if (shoppingCartItems == null || !shoppingCartItems.Any())
                throw new InvalidOperationException("购物篮中没有任何物品");

            order.OrderItems = new List<OrderItem>();
            foreach (var shoppingCartItem in shoppingCartItems)
            {
                var orderItem = shoppingCartItem.ConvertToOrderItem();
                orderItem.Order = order;
                order.OrderItems.Add(orderItem);
                _shoppingCartItemRepository.Remove(shoppingCartItem);
            }
            order.User = user;
            order.Status = OrderStatus.Paid;
            _orderRepository.Add(order);
            _repositoryContext.Commit();
            return order;
        }

        // 将指定的商品归类到指定的商品分类中。
        public ProductCategorization Categorize(Product product, Category category)
        {
            if(product == null)
                throw new ArgumentNullException("product");
            if(category == null)
                throw new ArgumentNullException("category");

            var productCategorization =
                _productCategorizationRepository.GetBySpecification(
                    Specification<ProductCategorization>.Eval(c => c.ProductId == product.Id));
            if (productCategorization == null)
            {
                productCategorization = ProductCategorization.CreateCategorization(product, category);
                _productCategorizationRepository.Add(productCategorization);
            }
            else
            {
                productCategorization.CategoryId = category.Id;
                _productCategorizationRepository.Update(productCategorization);
            }

            _repositoryContext.Commit();
            return productCategorization;
        }

        // 将指定的商品从其所属的商品分类中移除
        public void Uncategorize(Product product, Category category = null)
        {
            Expression<Func<ProductCategorization, bool>> specExpress = null
                ;
            if (category == null)
                specExpress = p => p.ProductId == product.Id;
            else
                specExpress = p => p.ProductId == product.Id && p.CategoryId == category.Id;
            var productCategorization = _productCategorizationRepository.GetByExpression(specExpress);
            if (productCategorization == null) return;

            _productCategorizationRepository.Remove(productCategorization);
            _repositoryContext.Commit();
        }

        // 将指定的用户赋予特定的角色。
        public UserRole AssignRole(User user, Role role)
        {
            if (user == null)
                throw new ArgumentNullException("user");
            if (role == null)
                throw new ArgumentNullException("role");
            var userRole = _userRoleRepository.GetBySpecification(Specification<UserRole>.Eval(ur => ur.UserId == user.Id));
            if (userRole == null)
            {
                userRole = UserRole.CreateUserRole(user, role);
                _userRoleRepository.Add(userRole);
            }
            else
            {
                userRole.RoleId = role.Id;
                _userRoleRepository.Update(userRole);
            }

            _repositoryContext.Commit();
            return userRole;
        }

        // 将指定的用户从角色中移除。
        public void UnassignRole(User user, Role role = null)
        {
            if (user == null)
                throw new ArgumentNullException("user");
            Expression<Func<UserRole, bool>> specExpression = null;
            if (role == null)
                specExpression = ur => ur.UserId == user.Id;
            else
                specExpression = ur => ur.UserId == user.Id && ur.RoleId == role.Id;

            UserRole userRole = _userRoleRepository.GetBySpecification(Specification<UserRole>.Eval(specExpression));

            if (userRole == null) return;

            _userRoleRepository.Remove(userRole);
            _repositoryContext.Commit();
        }
        #endregion 
    
    }
}

================================================
FILE: OnlineStore.Domain/Services/IDomainService.cs
================================================
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Services
{
    // 领域服务接口
    public interface IDomainService
    {
        Order CreateOrder(User user, ShoppingCart shoppingCart);

        /// <summary>
        /// 将指定的商品归类到指定的商品分类中。
        /// </summary>
        /// <param name="product">需要归类的商品。</param>
        /// <param name="category">商品分类。</param>
        /// <returns>用以表述商品及其分类之间关系的实体。</returns>
        ProductCategorization Categorize(Product product, Category category);

        /// <summary>
        /// 将指定的商品从其所属的商品分类中移除。
        /// </summary>
        /// <param name="product">商品。</param>
        /// <param name="category">分类,若为NULL,则表示从所有分类中移除。</param>
        void Uncategorize(Product product, Category category = null);

        /// <summary>
        /// 将指定的用户赋予特定的角色。
        /// </summary>
        /// <param name="user">用户实体。</param>
        /// <param name="role">角色实体。</param>
        /// <returns>用以表述用户及其角色之间关系的实体。</returns>
        UserRole AssignRole(User user, Role role);

        /// <summary>
        /// 将指定的用户从角色中移除。
        /// </summary>
        /// <param name="user">用户实体。</param>
        /// <param name="role">角色实体,若为NULL,则表示从所有角色中移除。</param>
        void UnassignRole(User user, Role role = null);
    }
}

================================================
FILE: OnlineStore.Domain/Specifications/AnySpecification.cs
================================================
using System;
using System.Linq.Expressions;

namespace OnlineStore.Domain.Specifications
{
    public sealed class AnySpecification<T> : Specification<T>
    {
        public override Expression<Func<T, bool>> Expression
        {
            get { return o => true; }
        }
    }
}

================================================
FILE: OnlineStore.Domain/Specifications/ExpressionSpecification.cs
================================================
using System;
using System.Linq.Expressions;

namespace OnlineStore.Domain.Specifications
{
    public sealed class ExpressionSpecification<T> : Specification<T>
    {
        private readonly Expression<Func<T, bool>> _expression; 
        public ExpressionSpecification(Expression<Func<T, bool>> expression)
        {
            this._expression = expression;
        }

        public override Expression<Func<T, bool>> Expression
        {
            get { return _expression; }
        }
    }
}

================================================
FILE: OnlineStore.Domain/Specifications/ISpecification.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.Domain.Specifications
{
    public interface ISpecification<T>
    {
        bool IsSatisfiedBy(T candidate);
        Expression<Func<T, bool>> Expression { get; }
    }
}


================================================
FILE: OnlineStore.Domain/Specifications/ParameterReplacer.cs
================================================
using System.Linq.Expressions;

namespace OnlineStore.Domain.Specifications
{
    public class ParameterReplacer : ExpressionVisitor
    {
        public ParameterReplacer(ParameterExpression paramExpr)
        {
            this.ParameterExpression = paramExpr;
        }

        public ParameterExpression ParameterExpression { get; private set; }

        public Expression Replace(Expression expr)
        {
            return this.Visit(expr);
        }

        protected override Expression VisitParameter(ParameterExpression p)
        {
            return this.ParameterExpression;
        }
    }
}

================================================
FILE: OnlineStore.Domain/Specifications/SpecExprExtensions.cs
================================================
using System;
using System.Linq.Expressions;

namespace OnlineStore.Domain.Specifications
{
    public static class SpecExprExtensions
    {
        public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> one)
        {
            var candidateExpr = one.Parameters[0];
            var body = Expression.Not(one.Body);

            return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> one,
            Expression<Func<T, bool>> another)
        {
            // 首先定义好一个ParameterExpression
            var candidateExpr = Expression.Parameter(typeof(T), "candidate");
            var parameterReplacer = new ParameterReplacer(candidateExpr);

            // 将表达式树的参数统一替换成我们定义好的candidateExpr
            var left = parameterReplacer.Replace(one.Body);
            var right = parameterReplacer.Replace(another.Body);

            var body = Expression.And(left, right);

            return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
        }

        public static Expression<Func<T, bool>> Or<T>(
            this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another)
        {
            var candidateExpr = Expression.Parameter(typeof(T), "candidate");
            var parameterReplacer = new ParameterReplacer(candidateExpr);

            var left = parameterReplacer.Replace(one.Body);
            var right = parameterReplacer.Replace(another.Body);
            var body = Expression.Or(left, right);

            return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
        } 
    }
}

================================================
FILE: OnlineStore.Domain/Specifications/Specification.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using OnlineStore.Domain.Model;

namespace OnlineStore.Domain.Specifications
{
    public abstract class Specification<T> : ISpecification<T>
    {
        public static Specification<T> Eval(Expression<Func<T, bool>> expression)
        {
            return new ExpressionSpecification<T>(expression);
        }

        #region ISpecification<T> Members
        public bool IsSatisfiedBy(T candidate)
        {
            return this.Expression.Compile()(candidate);
        }

        public abstract Expression<Func<T, bool>> Expression { get; }
        #endregion 
    }
}


================================================
FILE: OnlineStore.Domain/app.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.EnterpriseLibrary.Common" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity.Interception" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

================================================
FILE: OnlineStore.Events/Bus/EventBus.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading;
using OnlineStore.Infrastructure;

namespace OnlineStore.Events.Bus
{
    // 领域事件处理器只是对事件对象的状态进行更新
    // 后续的事件处理操作交给EventBus进行处理
    // 本案例中EventBus主要处理的任务就是发送邮件通知,
    // 在EventBus一般处理应用事件,而领域事件处理器一般处理领域事件
    public class EventBus : DisposableObject, IEventBus
    {
        private readonly Guid _id = Guid.NewGuid();
        private readonly ThreadLocal<Queue<object>> _messageQueue = new ThreadLocal<Queue<object>>(() => new Queue<object>());
        private readonly IEventAggregator _aggregator;
        private readonly ThreadLocal<bool> _committed = new ThreadLocal<bool>(() => true);
        private readonly MethodInfo _handleMethod;

        public EventBus(IEventAggregator aggregator)
        {
            this._aggregator = aggregator;

            // 获得EventAggregator中的Handle方法
            _handleMethod = (from m in aggregator.GetType().GetMethods()
                             let parameters = m.GetParameters()
                             let methodName = m.Name
                             where methodName == "Handle" &&
                             parameters != null &&
                             parameters.Length == 1
                             select m).First();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _messageQueue.Dispose();
                _committed.Dispose();
            }
        }

        #region IBus Members

        public Guid Id
        {
            get { return _id; }
        }

        public void Publish<TMessage>(TMessage message)
            where TMessage : class, IEvent
        {
            _messageQueue.Value.Enqueue(message);
            _committed.Value = false;
        }

        public void Publish<TMessage>(IEnumerable<TMessage> messages)
            where TMessage : class, IEvent
        {
            foreach (var message in messages)
                Publish(message);
        }

        public void Clear()
        {
            _messageQueue.Value.Clear();
            _committed.Value = true;
        }

        #endregion

        #region IUnitOfWork Members

        public bool DistributedTransactionSupported
        {
            get { return false; }
        }

        public bool Committed
        {
            get { return _committed.Value; }
        }

        // 触发应用事件处理器对事件进行处理
        public void Commit()
        {
            while (_messageQueue.Value.Count > 0)
            {
                var evnt = _messageQueue.Value.Dequeue();
                var evntType = evnt.GetType();
                var method = _handleMethod.MakeGenericMethod(evntType);
                // 调用应用事件处理器来对应用事件进行处理
                method.Invoke(_aggregator, new object[] { evnt });
            }
            _committed.Value = true;
        }

        public void Rollback()
        {
            Clear();
        }

        #endregion
    }
}

================================================
FILE: OnlineStore.Events/Bus/IBus.cs
================================================
using System;
using System.Collections.Generic;
using OnlineStore.Infrastructure;

namespace OnlineStore.Events.Bus
{
    public interface IBus : IUnitOfWork, IDisposable
    {
        Guid Id { get; }

        void Publish<TMessage>(TMessage message)
            where TMessage : class, IEvent;

        void Publish<TMessage>(IEnumerable<TMessage> messages)
           where TMessage : class, IEvent;

        void Clear();
    }
}

================================================
FILE: OnlineStore.Events/Bus/IEventBus.cs
================================================
namespace OnlineStore.Events.Bus
{
    public interface IEventBus : IBus
    {
    }
}

================================================
FILE: OnlineStore.Events/Bus/MsmqBusOptions.cs
================================================
using System.Messaging;

namespace OnlineStore.Events.Bus
{
    public class MsmqBusOptions
    {
        public bool SharedModeDenyReceive { get; set; }
        public bool EnableCache { get; set; }
        public QueueAccessMode QueueAccessMode { get; set; }
        public string Path { get; set; }
        public bool UseInternalTransaction { get; set; }

        public MsmqBusOptions(string path, bool sharedModeDenyReceive, bool enableCache, QueueAccessMode queueAccessMode, bool useInternalTransaction)
        {
            this.SharedModeDenyReceive = sharedModeDenyReceive;
            this.EnableCache = enableCache;
            this.QueueAccessMode = queueAccessMode;
            this.Path = path;
            this.UseInternalTransaction = useInternalTransaction;
        }

        public MsmqBusOptions(string path)
            : this(path, false, false, QueueAccessMode.SendAndReceive, false)
        { }

        public MsmqBusOptions(string path, bool useInternalTransaction)
            : this(path, false, false, QueueAccessMode.SendAndReceive, useInternalTransaction)
        { }
    }
}

================================================
FILE: OnlineStore.Events/Bus/MsmqEventBus.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Reflection;
using OnlineStore.Infrastructure;

namespace OnlineStore.Events.Bus
{
    // 基于微软MSMQ的EventBus的实现
    public class MsmqEventBus : DisposableObject, IEventBus
    {
        #region Private Fields

        private readonly Guid _id = Guid.NewGuid();
        private volatile bool _committed = true;
        private readonly bool _useInternalTransaction;
        private readonly MessageQueue _messageQueue;
        private readonly IEventAggregator _aggregator;
        private readonly MethodInfo _publishMethod;

        #endregion

        #region Ctor

        public MsmqEventBus(string path)
        {
            this._aggregator = ServiceLocator.Instance.GetService<IEventAggregator>();

            _publishMethod = (from m in _aggregator.GetType().GetMethods()
                let parameters = m.GetParameters()
                let methodName = m.Name
                where methodName == "Handle" &&
                      parameters != null &&
                      parameters.Length == 1
                select m).First();
            var options = new MsmqBusOptions(path);

            // 初始化消息队列对象
            // 更多信息参考:https://msdn.microsoft.com/zh-cn/library/System.Messaging.MessageQueue(v=vs.110).aspx 
            this._messageQueue = new MessageQueue(path,
                options.SharedModeDenyReceive,
                options.EnableCache, options.QueueAccessMode);

            this._useInternalTransaction = options.UseInternalTransaction && _messageQueue.Transactional;
        }

        #endregion

        #region IEventBus Members

        public Guid Id
        {
            get { return _id; }
        }

        public void Publish<TMessage>(TMessage message) where TMessage : class, IEvent
        {
            // 将消息放入Message中Body属性进行序列化发送到消息队列中
            var msmqMessage = new Message(message) { Formatter = new XmlMessageFormatter(new[] { message.GetType() }), Label = message.GetType().ToString()};
            _messageQueue.Send(msmqMessage);
            _committed = false;
        }

        public void Publish<TMessage>(IEnumerable<TMessage> messages) where TMessage : class, IEvent
        {
            messages.ToList().ForEach(m =>
            {
                _messageQueue.Send(m);
                _committed = false;
            });
        }

        public void Clear()
        {
            this._messageQueue.Close();
        }

        public void Commit()
        {
            if (this._useInternalTransaction)
            {
                using (var transaction = new MessageQueueTransaction())
                {
                    try
                    {
                        transaction.Begin();
                        var message = _messageQueue.Receive();
                        if (message != null)
                        {
                            message.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
                            var evntType = ConvertStringToType(message.Body.ToString());
                            var method = _publishMethod.MakeGenericMethod(evntType);
                            var evnt = Activator.CreateInstance(evntType);
                            method.Invoke(_aggregator, new object[] { evnt });

                            transaction.Commit();
                        }
                    }
                    catch
                    {
                        transaction.Abort();
                        throw;
                    }
                }
            }
            else
            {
                // 从msmq消息队列中出队,此时获得的对象是消息对象
                var message = _messageQueue.Receive();
                if (message != null)
                {
                    // 指定反序列化的对象,由于我们之前把对应的事件类型保存在MessageQueue中的Label属性
                    // 所以此时可以通过Label属性来获得目标序列化类型
                    message.Formatter = new XmlMessageFormatter(new[] { ConvertStringToType(message.Label) });
                    
                    // 这样message.Body获得就是对应的事件对象,后面的处理逻辑就和EventBus一样了
                    var evntType =message.Body.GetType();
                    var method = _publishMethod.MakeGenericMethod(evntType);
                    method.Invoke(_aggregator, new object[] { message.Body });
                }
            }

            _committed = true;
        }

        #endregion

        #region DisposableObject Members

        protected override void Dispose(bool disposing)
        {
            if (!disposing) return;
            if (_messageQueue == null) return;

            _messageQueue.Close();
            _messageQueue.Dispose();
        }

        #endregion

        private Type ConvertStringToType(string sourceStr)
        {
            return Type.GetType(sourceStr + ", OnlineStore.Domain");
        }
    }
}


================================================
FILE: OnlineStore.Events/EventAggregator.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using OnlineStore.Infrastructure;

namespace OnlineStore.Events
{
    public class EventAggregator : IEventAggregator
    {
        private readonly object _sync = new object();
        private readonly Dictionary<Type, List<object>> _eventHandlers = new Dictionary<Type, List<object>>();
        private readonly MethodInfo _registerEventHandlerMethod;

        public EventAggregator()
        {
            
            // 通过反射获得EventAggregator的Register方法 
            _registerEventHandlerMethod = (from p in this.GetType().GetMethods()
                                          let methodName = p.Name
                                          let parameters = p.GetParameters()
                                          where methodName == "Register" &&
                                          parameters != null &&
                                          parameters.Length == 1 &&
                                          parameters[0].ParameterType.GetGenericTypeDefinition() == typeof(IEventHandler<>)
                                          select p).First();
        }

        public EventAggregator(object[] handlers)
            : this()
        {
            // 遍历注册的EventHandler来把配置文件中具体的EventHanler通过Register添加进_eventHandlers字典中
            foreach (var obj in handlers)
            {
                var type = obj.GetType();
                var implementedInterfaces = type.GetInterfaces();
                foreach (var implementedInterface in implementedInterfaces)
                {
                    if (implementedInterface.IsGenericType &&
                        implementedInterface.GetGenericTypeDefinition() == typeof(IEventHandler<>))
                    {
                        var eventType = implementedInterface.GetGenericArguments().First();
                        var method = _registerEventHandlerMethod.MakeGenericMethod(eventType);
                        // 调用Register方法将EventHandler添加进_eventHandlers字典中
                        method.Invoke(this, new object[] { obj });
                    }
                }
            }
        }

        public void Register<TEvent>(IEventHandler<TEvent> eventHandler)
            where TEvent : class, IEvent
        {
            lock (_sync)
            {
                var eventType = typeof(TEvent);
                if (_eventHandlers.ContainsKey(eventType))
                {
                    var handlers = _eventHandlers[eventType];
                    if (handlers != null)
                    {
                        handlers.Add(eventHandler);
                    }
                    else
                    {
                        handlers = new List<object> {eventHandler};
                    }
                }
                else
                    _eventHandlers.Add(eventType, new List<object> { eventHandler });
            }
        }

        public void Register<TEvent>(IEnumerable<IEventHandler<TEvent>> eventHandlers)
            where TEvent : class, IEvent
        {
            foreach (var eventHandler in eventHandlers)
                Register<TEvent>(eventHandler);
        }

        // 调用具体的EventHanler的Handle方法来对事件进行处理
         public void Handle<TEvent>(TEvent evnt)
            where TEvent : class, IEvent
        {
            if (evnt == null)
                throw new ArgumentNullException("evnt");
            var eventType = evnt.GetType();
            if (_eventHandlers.ContainsKey(eventType) &&
                _eventHandlers[eventType] != null &&
                _eventHandlers[eventType].Count > 0)
            {
                var handlers = _eventHandlers[eventType];
                foreach (var handler in handlers)
                {
                    var eventHandler = handler as IEventHandler<TEvent>;
                    if(eventHandler == null)
                        continue;

                    // 异步处理
                    if (eventHandler.GetType().IsDefined(typeof(HandlesAsynchronouslyAttribute), false))
                    {
                        Task.Factory.StartNew((o) => eventHandler.Handle((TEvent)o), evnt);
                    }
                    else
                    {
                        eventHandler.Handle(evnt);
                    }
                }
            }
        }

        public void Handle<TEvent>(TEvent evnt, Action<TEvent, bool, Exception> callback, TimeSpan? timeout = null)
            where TEvent : class, IEvent
        {
            if (evnt == null)
                throw new ArgumentNullException("evnt");
            var eventType = evnt.GetType();
            if (_eventHandlers.ContainsKey(eventType) &&
                _eventHandlers[eventType] != null &&
                _eventHandlers[eventType].Count > 0)
            {
                var handlers = _eventHandlers[eventType];
                List<Task> tasks = new List<Task>();
                try
                {
                    foreach (var handler in handlers)
                    {
                        var eventHandler = handler as IEventHandler<TEvent>;
                        if (eventHandler == null)
                            continue;
                        if (eventHandler.GetType().IsDefined(typeof(HandlesAsynchronouslyAttribute), false))
                        {
                            tasks.Add(Task.Factory.StartNew((o) => eventHandler.Handle((TEvent)o), evnt));
                        }
                        else
                        {
                            eventHandler.Handle(evnt);
                        }
                    }
                    if (tasks.Count > 0)
                    {
                        if (timeout == null)
                            Task.WaitAll(tasks.ToArray());
                        else
                            Task.WaitAll(tasks.ToArray(), timeout.Value);
                    }
                    callback(evnt, true, null);
                }
                catch (Exception ex)
                {
                    callback(evnt, false, ex);
                }
            }
            else
                callback(evnt, false, null);
        }
    }
}

================================================
FILE: OnlineStore.Events/HandlesAsynchronouslyAttribute.cs
================================================
using System;

namespace OnlineStore.Events
{
    // 如果事件处理器添加了该属性,表示以异步的方式处理事件
    [AttributeUsage(AttributeTargets.Class, Inherited = false)]
    public class HandlesAsynchronouslyAttribute : Attribute
    {
    }
}

================================================
FILE: OnlineStore.Events/IEvent.cs
================================================
using System;

namespace OnlineStore.Events
{
    // 事件接口
    public interface IEvent
    {
        Guid Id { get; }

        // 获取产生事件的时间
        DateTime TimeStamp { get; }
    }
}

================================================
FILE: OnlineStore.Events/IEventAggregator.cs
================================================
using System;
using System.Collections.Generic;

namespace OnlineStore.Events
{
    public interface IEventAggregator
    {
        void Register<TEvent>(IEventHandler<TEvent> domainEventHandler)
           where TEvent : class, IEvent;
        void Register<TEvent>(IEnumerable<IEventHandler<TEvent>> domainEventHandlers)
            where TEvent : class, IEvent;

        void Handle<TEvent>(TEvent domainEvent)
           where TEvent : class, IEvent;
        void Handle<TEvent>(TEvent domainEvent, Action<TEvent, bool, Exception> callback, TimeSpan? timeout = null)
            where TEvent : class, IEvent;
    }
}

================================================
FILE: OnlineStore.Events/IEventHandler.cs
================================================
namespace OnlineStore.Events
{
    // 事件处理器接口
    public interface IEventHandler<in TEvent>
        where TEvent : IEvent
    {
        // 处理给定的事件
        void Handle(TEvent @event);
    }
}

================================================
FILE: OnlineStore.Events/OnlineStore.Events.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{F165ABC2-F76A-4FD7-8675-833264855221}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>OnlineStore.Events</RootNamespace>
    <AssemblyName>OnlineStore.Events</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Messaging" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Bus\EventBus.cs" />
    <Compile Include="Bus\IBus.cs" />
    <Compile Include="Bus\IEventBus.cs" />
    <Compile Include="Bus\MsmqBusOptions.cs" />
    <Compile Include="Bus\MsmqEventBus.cs" />
    <Compile Include="EventAggregator.cs" />
    <Compile Include="HandlesAsynchronouslyAttribute.cs" />
    <Compile Include="IEvent.cs" />
    <Compile Include="IEventAggregator.cs" />
    <Compile Include="IEventHandler.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\OnlineStore.Infrastructure\OnlineStore.Infrastructure.csproj">
      <Project>{9dde33cc-cf3c-436e-8a5f-4e1f0f8b603e}</Project>
      <Name>OnlineStore.Infrastructure</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: OnlineStore.Events/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("OnlineStore.Events")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OnlineStore.Events")]
[assembly: AssemblyCopyright("Copyright ©  2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("00ced95c-df18-4d3b-a3a2-870dc7c51a7c")]

// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本 
//      生成号
//      修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: OnlineStore.Events/app.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.EnterpriseLibrary.Common" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity.Interception" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

================================================
FILE: OnlineStore.Events.Handlers/OnlineStore.Events.Handlers.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{2471E6B9-1030-48B8-BBC4-5018A221FBE2}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>OnlineStore.Events.Handlers</RootNamespace>
    <AssemblyName>OnlineStore.Events.Handlers</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="SendEmailHandler.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\OnlineStore.Domain\OnlineStore.Domain.csproj">
      <Project>{1ae7732f-2faf-407e-89dd-bad81c4132e0}</Project>
      <Name>OnlineStore.Domain</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Events\OnlineStore.Events.csproj">
      <Project>{f165abc2-f76a-4fd7-8675-833264855221}</Project>
      <Name>OnlineStore.Events</Name>
    </ProjectReference>
    <ProjectReference Include="..\OnlineStore.Infrastructure\OnlineStore.Infrastructure.csproj">
      <Project>{9dde33cc-cf3c-436e-8a5f-4e1f0f8b603e}</Project>
      <Name>OnlineStore.Infrastructure</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: OnlineStore.Events.Handlers/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("OnlineStore.Events.Handlers")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OnlineStore.Events.Handlers")]
[assembly: AssemblyCopyright("Copyright ©  2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("4aacb77c-8537-48d1-ac75-f779950b3ae4")]

// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本 
//      生成号
//      修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: OnlineStore.Events.Handlers/SendEmailHandler.cs
================================================
using System;
using OnlineStore.Domain.Events;
using OnlineStore.Infrastructure;

namespace OnlineStore.Events.Handlers
{
    [HandlesAsynchronously]
    public class SendEmailHandler : IEventHandler<OrderDispatchedEvent>, IEventHandler<OrderConfirmedEvent>
    {
        // 处理确认收货事件
        public void Handle(OrderConfirmedEvent @event)
        {
            try
            {
                Utils.SendEmail(@event.UserEmailAddress,
                    "您的订单已经确认收货",
                    string.Format("您的订单 {0} 已于 {1} 确认收货,欢迎您随时关注订单状态",
                    @event.OrderId.ToString().ToUpper(), @event.ConfirmedDate));
            }
            catch (Exception ex)
            {
                // 如遇异常,直接记Log
                Utils.Log(ex);
            }
        }

        // 处理发货事件
        public void Handle(OrderDispatchedEvent @event)
        {
            try
            {
                Utils.SendEmail(@event.UserEmailAddress,
                    "您的订单已经发货",
                    string.Format("您的订单 {0} 已于 {1} 发货, 欢迎您随时关注订单状态",
                    @event.OrderId.ToString().ToUpper(), @event.DispatchedDate));
            }
            catch (Exception ex)
            {
                // 如遇异常,直接记Log
                Utils.Log(ex);
            }
        }
    }
}

================================================
FILE: OnlineStore.Events.Handlers/app.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.EnterpriseLibrary.Common" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.Unity.Interception" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

================================================
FILE: OnlineStore.Infrastructure/Caching/AppfabricCacheProvider.cs
================================================
using System.Collections.Generic;
using Microsoft.ApplicationServer.Caching;

namespace OnlineStore.Infrastructure.Caching
{
    // 分布式缓存,该类是对微软分布式缓存服务的封装
    // 在该案例中没用用到该缓存,但是提供在这里让大家明白微软的分布式缓存实现,并不是只有memcached和Redis
    // Redis参考:http://www.cnblogs.com/ceecy/p/3279407.html 和 http://blog.csdn.net/suifeng3051/article/details/23739295
    // 关于微软分布式缓存更多介绍参考:http://www.cnblogs.com/shanyou/archive/2010/06/29/AppFabricCaching.html 
    // 和http://www.cnblogs.com/mlj322/archive/2010/04/05/1704624.html
    public class AppfabricCacheProvider : ICacheProvider
    {
        private readonly DataCacheFactory _factory = new DataCacheFactory();
        private readonly DataCache _cache;

        public AppfabricCacheProvider()
        {
            this._cache = _factory.GetDefaultCache();
        }

        #region ICacheProvider Members
        public void Add(string key, string valueKey, object value)
        {
            // DataCache中不包含Contain方法,所有用Get方法来判断对应的key值是否在缓存中存在
            var val = (Dictionary<string, object>)_cache.Get(key);
            if (val == null)
            {
                val = new Dictionary<string, object> {{ valueKey, value}};
                _cache.Add(key, val);
            }
            else
            {
                if (!val.ContainsKey(valueKey))
                    val.Add(valueKey, value);
                else
                    val[valueKey] = value;

                _cache.Put(key, val);
            }
        }

        public void Update(string key, string valueKey, object value)
        {
            Add(key, valueKey, value);
        }

        public object Get(string key, string valueKey)
        {
            return Exists(key, valueKey) ? ((Dictionary<string, object>)_cache.Get(key))[valueKey] : null;
        }

        public void Remove(string key)
        {
            _cache.Remove(key);
        }

        public bool Exists(string key)
        {
            return _cache.Get(key) != null;
        }

        public bool Exists(string key, string valueKey)
        {
            var val = _cache.Get(key);
            if (val == null)
                return false;
            return ((Dictionary<string, object>)val).ContainsKey(valueKey);
        }

        #endregion 
    }
}

================================================
FILE: OnlineStore.Infrastructure/Caching/CacheAttribute.cs
================================================
using System;

namespace OnlineStore.Infrastructure.Caching
{
    [AttributeUsage(AttributeTargets.Method, Inherited = false)]
    public class CacheAttribute : Attribute
    {
        public CachingMethod Method { get; set; }

        public bool IsForce { get; set; }
        
        // 缓存相关的方法名称,该参数仅在Remove的方式用到
        public string[] CorrespondingMethodNames { get; set; }

        public CacheAttribute(CachingMethod method)
        {
            this.Method = method;
        }

        public CacheAttribute(CachingMethod method, params string[] correspondingMethodNames)
            : this(method)
        {
            this.CorrespondingMethodNames = correspondingMethodNames;
        }
    }
}

================================================
FILE: OnlineStore.Infrastructure/Caching/CachingMethod.cs
================================================
namespace OnlineStore.Infrastructure.Caching
{
    /// <summary>
    /// 缓存方式
    /// </summary>
    public enum CachingMethod
    {
        Get,
        Update,
        Remove
    }
}

================================================
FILE: OnlineStore.Infrastructure/Caching/EntLibCacheProvider.cs
================================================
using System.Collections.Generic;
using Microsoft.Practices.EnterpriseLibrary.Caching;

namespace OnlineStore.Infrastructure.Caching
{
    // 表示基于Microsoft Patterns & Practices - Enterprise Library Caching Application Block的缓存机制的实现
    // 该类简单理解为对Enterprise Library Caching中的CacheManager封装
    // 该缓存实现不支持分布式缓存,更多信息参考: 
    // http://stackoverflow.com/questions/7799664/enterpriselibrary-caching-in-load-balance 
    public class EntLibCacheProvider : ICacheProvider
    {
        // 获得CacheManager实例,该实例的注册通过cachingConfiguration进行注册进去的,具体看配置文件
        private readonly ICacheManager _cacheManager = CacheFactory.GetCacheManager();

        #region ICahceProvider

        public void Add(string key, string valueKey, object value)
        {
            Dictionary<string, object> dict = null;
            if (_cacheManager.Contains(key))
            {
                dict = (Dictionary<string, object>) _cacheManager[key];
                dict[valueKey] = value;
            }
            else
            {
                dict = new Dictionary<string, object> { { valueKey, value }};
            }

            _cacheManager.Add(key, dict);
        }

        public void Update(string key, string valueKey, object value)
        {
            Add(key, valueKey, value);
        }

        public object Get(string key, string valueKey)
        {
            if (!_cacheManager.Contains(key)) return null;
            var dict = (Dictionary<string, object>)_cacheManager[key];
            if (dict != null && dict.ContainsKey(valueKey))
                return dict[valueKey];
            else
                return null;
        }

        // 从缓存中移除对象
        public void Remove(string key)
        {
            _cacheManager.Remove(key);
        }

        // 判断指定的键值的缓存是否存在
        public bool Exists(string key)
        {
            return _cacheManager.Contains(key);
        }

        // 判断指定的键值和缓存键值的缓存是否存在
        public bool Exists(string key, string valueKey)
        {
            return _cacheManager.Contains(key) &&
               ((Dictionary<string, object>)_cacheManager[key]).ContainsKey(valueKey);
        }
        #endregion 
    }
}

================================================
FILE: OnlineStore.Infrastructure/Caching/ICacheProvider.cs
================================================
namespace OnlineStore.Infrastructure.Caching
{
    // 缓存接口的定义
    public interface ICacheProvider
    {
        /// <summary>
        /// 向缓存中添加一个对象
        /// </summary>
        /// <param name="key">缓存的键值</param>
        /// <param name="valueKey">缓存值的键值</param>
        /// <param name="value">缓存的对象</param>
        void Add(string key, string valueKey, object value);
        void Update(string key, string valueKey, object value);
        object Get(string key, string valueKey);
        void Remove(string key);
        bool Exists(string key);
        bool Exists(string key, string valueKey);
    }
}

================================================
FILE: OnlineStore.Infrastructure/DisposableObject.cs
================================================
using System;

namespace OnlineStore.Infrastructure
{
    public abstract class DisposableObject :IDisposable
    {
        ~DisposableObject()
        {
            this.Dispose(false);
        }
      
        protected abstract void Dispose(bool disposing);
        
        protected void ExplicitDispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
        
        #region IDisposable Members
        
        public void Dispose()
        {
            this.ExplicitDispose();
        }
        #endregion
    }
}

================================================
FILE: OnlineStore.Infrastructure/IUnitOfWork.cs
================================================
namespace OnlineStore.Infrastructure
{
    public interface IUnitOfWork
    {
        void Commit();
    }
}

================================================
FILE: OnlineStore.Infrastructure/InterceptionBehaviors/CachingBehavior.cs
================================================
using OnlineStore.Infrastructure.Caching;
using Microsoft.Practices.Unity.InterceptionExtension;
using System;
using System.Collections.Generic;
using System.Text;

namespace OnlineStore.Infrastructure.InterceptionBehaviors
{
    // 缓存AOP的实现
    public class CachingBehavior : IInterceptionBehavior
    {
        private readonly ICacheProvider _cacheProvider;

        public CachingBehavior()
        {
            _cacheProvider = ServiceLocator.Instance.GetService<ICacheProvider>();
        }

        // 生成缓存值的键值
        private string GetValueKey(CacheAttribute cachingAttribute, IMethodInvocation input)
        {
            switch (cachingAttribute.Method)
            {
                // 如果是Remove,则不存在特定值键名,所有的以该方法名称相关的缓存都需要清除
                case CachingMethod.Remove:
                    return null;
                // 如果是Get或者Update,则需要产生一个针对特定参数值的键名
                case CachingMethod.Get:
                case CachingMethod.Update:
                    if (input.Arguments != null &&
                        input.Arguments.Count > 0)
                    {
                        var sb = new StringBuilder();
                        for (var i = 0; i < input.Arguments.Count; i++)
                        {
                            sb.Append(input.Arguments[i]);
                            if (i != input.Arguments.Count - 1)
                                sb.Append("_");
                        }

                        return sb.ToString();
                    }
                    else
                        return "NULL";
                default:
                    throw new InvalidOperationException("无效的缓存方式。");
            }
        }

        #region IInterceptionBehavior Members
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            // 获得被拦截的方法
            var method = input.MethodBase;
            var key = method.Name; // 获得拦截的方法名
            // 如果拦截的方法定义了Cache属性,说明需要对该方法的结果需要进行缓存
            if (!method.IsDefined(typeof (CacheAttribute), false)) 
                return getNext().Invoke(input, getNext);

            var cachingAttribute = (CacheAttribute)method.GetCustomAttributes(typeof (CacheAttribute), false)[0];
            var valueKey = GetValueKey(cachingAttribute, input);
            switch (cachingAttribute.Method)
            {
                case CachingMethod.Get:
                    try
                    {
                        // 如果缓存中存在该键值的缓存,则直接返回缓存中的结果退出
           
Download .txt
gitextract_wa3viklp/

├── .gitattributes
├── .gitignore
├── .nuget/
│   ├── NuGet.Config
│   └── NuGet.targets
├── OnlineStore.Application/
│   ├── AddressResolver.cs
│   ├── App_Data/
│   │   ├── OnlineStore.mdf
│   │   └── OnlineStore_log.ldf
│   ├── ApplicationService.cs
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── InversedAddressResolver.cs
│   ├── Logs/
│   │   └── onlinestore.txt
│   ├── OnlineStore.Application.csproj
│   ├── OrderService.svc
│   ├── OrderService.svc.cs
│   ├── ProductService.svc
│   ├── ProductService.svc.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ServiceImplementations/
│   │   ├── OrderServiceImp.cs
│   │   ├── ProductServiceImp.cs
│   │   └── UserServiceImp.cs
│   ├── UserService.svc
│   ├── UserService.svc.cs
│   ├── Web.Debug.config
│   ├── Web.Release.config
│   ├── Web.config
│   └── packages.config
├── OnlineStore.Domain/
│   ├── DomainException.cs
│   ├── Events/
│   │   ├── DomainEvent.cs
│   │   ├── EventHandlers/
│   │   │   ├── OrderConfirmedEventHandler.cs
│   │   │   └── OrderDispatchedEventHandler.cs
│   │   ├── IDomainEvent.cs
│   │   ├── IDomainEventHandler.cs
│   │   ├── OrderConfirmedEvent.cs
│   │   └── OrderDispatchedEvent.cs
│   ├── IAggregateRoot.cs
│   ├── IEntity.cs
│   ├── Model/
│   │   ├── Address.cs
│   │   ├── AggregateRoot.cs
│   │   ├── Category.cs
│   │   ├── Order.cs
│   │   ├── OrderItem.cs
│   │   ├── OrderStatus.cs
│   │   ├── Product.cs
│   │   ├── ProductCategorization.cs
│   │   ├── Role.cs
│   │   ├── ShoppingCart.cs
│   │   ├── ShoppingCartItem.cs
│   │   ├── User.cs
│   │   └── UserRole.cs
│   ├── OnlineStore.Domain.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Repositories/
│   │   ├── ICategoryRepository.cs
│   │   ├── IOrderRepository.cs
│   │   ├── IProductCategorizationRepository.cs
│   │   ├── IProductRepository.cs
│   │   ├── IRepository.cs
│   │   ├── IRepositoryContext.cs
│   │   ├── IRoleRepository.cs
│   │   ├── IShoppingCartItemRepository.cs
│   │   ├── IShoppingCartRepository.cs
│   │   ├── IUserRepository.cs
│   │   ├── IUserRoleRepository.cs
│   │   └── SortOrder.cs
│   ├── Services/
│   │   ├── DomainService.cs
│   │   └── IDomainService.cs
│   ├── Specifications/
│   │   ├── AnySpecification.cs
│   │   ├── ExpressionSpecification.cs
│   │   ├── ISpecification.cs
│   │   ├── ParameterReplacer.cs
│   │   ├── SpecExprExtensions.cs
│   │   └── Specification.cs
│   └── app.config
├── OnlineStore.Events/
│   ├── Bus/
│   │   ├── EventBus.cs
│   │   ├── IBus.cs
│   │   ├── IEventBus.cs
│   │   ├── MsmqBusOptions.cs
│   │   └── MsmqEventBus.cs
│   ├── EventAggregator.cs
│   ├── HandlesAsynchronouslyAttribute.cs
│   ├── IEvent.cs
│   ├── IEventAggregator.cs
│   ├── IEventHandler.cs
│   ├── OnlineStore.Events.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── app.config
├── OnlineStore.Events.Handlers/
│   ├── OnlineStore.Events.Handlers.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── SendEmailHandler.cs
│   └── app.config
├── OnlineStore.Infrastructure/
│   ├── Caching/
│   │   ├── AppfabricCacheProvider.cs
│   │   ├── CacheAttribute.cs
│   │   ├── CachingMethod.cs
│   │   ├── EntLibCacheProvider.cs
│   │   └── ICacheProvider.cs
│   ├── DisposableObject.cs
│   ├── IUnitOfWork.cs
│   ├── InterceptionBehaviors/
│   │   ├── CachingBehavior.cs
│   │   └── ExceptionLoggingBehavior.cs
│   ├── OnlineStore.Infrastructure.csproj
│   ├── PagedResult.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ServiceLocator.cs
│   ├── Utils.cs
│   ├── app.config
│   └── packages.config
├── OnlineStore.ModelDTO/
│   ├── OnlineStore.ModelDTO.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Service References/
│   │   ├── OrderService/
│   │   │   ├── OnlineStore.ModelDTO.OrderService.ShoppingCart.datasource
│   │   │   ├── OrderService.disco
│   │   │   ├── OrderService.wsdl
│   │   │   ├── OrderService.xsd
│   │   │   ├── OrderService1.xsd
│   │   │   ├── OrderService2.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   └── ProductService/
│   │       ├── OnlineStore.ModelDTO.ProductService.Category.datasource
│   │       ├── OnlineStore.ModelDTO.ProductService.Product.datasource
│   │       ├── ProductService.disco
│   │       ├── ProductService.wsdl
│   │       ├── ProductService.xsd
│   │       ├── ProductService1.wsdl
│   │       ├── ProductService1.xsd
│   │       ├── ProductService2.xsd
│   │       ├── Reference.cs
│   │       ├── Reference.svcmap
│   │       ├── configuration.svcinfo
│   │       └── configuration91.svcinfo
│   └── app.config
├── OnlineStore.Repositories/
│   ├── App.config
│   ├── EntityFramework/
│   │   ├── CategoryRepository.cs
│   │   ├── EntityFrameworkRepository.cs
│   │   ├── EntityFrameworkRepositoryContext.cs
│   │   ├── IEntityFrameworkRepositoryContext.cs
│   │   ├── ModelConfigurations/
│   │   │   ├── CategoryTypeConfiguration.cs
│   │   │   ├── OrderItemTypeConfiguration.cs
│   │   │   ├── OrderTypeConfiguration.cs
│   │   │   ├── ProductCategorizationTypeConfiguration.cs
│   │   │   ├── ProductTypeConfiguration.cs
│   │   │   ├── RoleTypeConfiguration.cs
│   │   │   ├── ShoppingCartItemTypeConfiguration.cs
│   │   │   ├── ShoppingCartTypeConfiguration.cs
│   │   │   ├── UserRoleTypeConfiguration.cs
│   │   │   └── UserTypeConfiguration.cs
│   │   ├── OnlineStoreDbContext.cs
│   │   ├── OnlineStoreDbContextInitailizer.cs
│   │   ├── OrderRepository.cs
│   │   ├── ProductCategorizationRepository.cs
│   │   ├── ProductRepository.cs
│   │   ├── RoleRepository.cs
│   │   ├── ShoppingCartItemRepository.cs
│   │   ├── ShoppingCartRepository.cs
│   │   ├── SortByExtension.cs
│   │   ├── UserRepository.cs
│   │   └── UserRoleRepository.cs
│   ├── OnlineStore.Repositories.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── packages.config
├── OnlineStore.ServiceContract/
│   ├── IOrderService.cs
│   ├── IProductService.cs
│   ├── IUserService.cs
│   ├── ModelDTOs/
│   │   ├── AddressDto.cs
│   │   ├── CategoryDto.cs
│   │   ├── FaultData.cs
│   │   ├── OrderDto.cs
│   │   ├── OrderItemDto.cs
│   │   ├── OrderStatusDto.cs
│   │   ├── Pagination.cs
│   │   ├── ProductCategorizationDto.cs
│   │   ├── ProductDto.cs
│   │   ├── ProductDtoWithPagination.cs
│   │   ├── RoleDto.cs
│   │   ├── ShoppingCartDto.cs
│   │   ├── ShoppingCartItemDto.cs
│   │   └── UserDto.cs
│   ├── OnlineStore.ServiceContracts.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── app.config
├── OnlineStore.Web/
│   ├── App_Code/
│   │   ├── HtmlExtension.cs
│   │   ├── PermissionKeys.cs
│   │   └── UrlHelperExtension.cs
│   ├── App_Start/
│   │   ├── AuthConfig.cs
│   │   ├── BundleConfig.cs
│   │   ├── FilterConfig.cs
│   │   ├── RouteConfig.cs
│   │   └── WebApiConfig.cs
│   ├── Content/
│   │   ├── Site.css
│   │   ├── themes/
│   │   │   └── base/
│   │   │       ├── jquery-ui.css
│   │   │       ├── jquery.ui.accordion.css
│   │   │       ├── jquery.ui.all.css
│   │   │       ├── jquery.ui.autocomplete.css
│   │   │       ├── jquery.ui.base.css
│   │   │       ├── jquery.ui.button.css
│   │   │       ├── jquery.ui.core.css
│   │   │       ├── jquery.ui.datepicker.css
│   │   │       ├── jquery.ui.dialog.css
│   │   │       ├── jquery.ui.progressbar.css
│   │   │       ├── jquery.ui.resizable.css
│   │   │       ├── jquery.ui.selectable.css
│   │   │       ├── jquery.ui.slider.css
│   │   │       ├── jquery.ui.tabs.css
│   │   │       └── jquery.ui.theme.css
│   │   ├── uploadify.css
│   │   └── uploadify.swf
│   ├── Controllers/
│   │   ├── AccountController.cs
│   │   ├── AdminController.cs
│   │   ├── ControllerBase.cs
│   │   ├── HomeController.cs
│   │   └── LayoutController.cs
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── Membership/
│   │   ├── OnlineStoreMembershipProvider.cs
│   │   └── OnlineStoreMembershipUser.cs
│   ├── MvcSiteMap.cs
│   ├── OnlineStore.Web.csproj
│   ├── OnlineStore.Web.csproj.DotSettings
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Scripts/
│   │   ├── _references.js
│   │   ├── hoverIntent.js
│   │   ├── jquery-1.7.1.intellisense.js
│   │   ├── jquery-1.7.1.js
│   │   ├── jquery-ui-1.8.20.js
│   │   ├── jquery.unobtrusive-ajax.js
│   │   ├── jquery.uploadify.js
│   │   ├── jquery.validate-vsdoc.js
│   │   ├── jquery.validate.js
│   │   ├── jquery.validate.unobtrusive.js
│   │   ├── knockout-2.1.0.debug.js
│   │   ├── knockout-2.1.0.js
│   │   ├── modernizr-2.5.3.js
│   │   ├── superfish.js
│   │   └── supersubs.js
│   ├── Service References/
│   │   ├── OnlineStoreDto.Partial.cs
│   │   ├── OrderService/
│   │   │   ├── OnlineStore.Web.OrderService.OrderDto.datasource
│   │   │   ├── OnlineStore.Web.OrderService.ShoppingCartDto.datasource
│   │   │   ├── OrderService.disco
│   │   │   ├── OrderService.wsdl
│   │   │   ├── OrderService.xsd
│   │   │   ├── OrderService1.xsd
│   │   │   ├── OrderService2.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   ├── ProductService/
│   │   │   ├── OnlineStore.Web.ProductService.CategoryDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductCategorizationDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductDto.datasource
│   │   │   ├── OnlineStore.Web.ProductService.ProductDtoWithPagination.datasource
│   │   │   ├── ProductService.disco
│   │   │   ├── ProductService.wsdl
│   │   │   ├── ProductService.xsd
│   │   │   ├── ProductService1.wsdl
│   │   │   ├── ProductService1.xsd
│   │   │   ├── ProductService2.xsd
│   │   │   ├── ProductService3.xsd
│   │   │   ├── Reference.cs
│   │   │   ├── Reference.svcmap
│   │   │   ├── configuration.svcinfo
│   │   │   └── configuration91.svcinfo
│   │   └── UserService/
│   │       ├── OnlineStore.Web.UserService.OrderDto.datasource
│   │       ├── OnlineStore.Web.UserService.RoleDto.datasource
│   │       ├── OnlineStore.Web.UserService.UserDto.datasource
│   │       ├── Reference.cs
│   │       ├── Reference.svcmap
│   │       ├── UserService.disco
│   │       ├── UserService.wsdl
│   │       ├── UserService.xsd
│   │       ├── UserService1.wsdl
│   │       ├── UserService1.xsd
│   │       ├── UserService2.xsd
│   │       ├── UserService3.xsd
│   │       ├── configuration.svcinfo
│   │       └── configuration91.svcinfo
│   ├── SiteMap.xml
│   ├── ViewModels/
│   │   ├── LoginViewModel.cs
│   │   └── UserAccountModel.cs
│   ├── Views/
│   │   ├── Account/
│   │   │   ├── Login.cshtml
│   │   │   ├── Manage.cshtml
│   │   │   └── Register.cshtml
│   │   ├── Admin/
│   │   │   ├── AddCategory.cshtml
│   │   │   ├── AddProduct.cshtml
│   │   │   ├── AddRole.cshtml
│   │   │   ├── AddUserAccount.cshtml
│   │   │   ├── Administration.cshtml
│   │   │   ├── Categories.cshtml
│   │   │   ├── EditCategory.cshtml
│   │   │   ├── EditProduct.cshtml
│   │   │   ├── EditRole.cshtml
│   │   │   ├── EditUserAccount.cshtml
│   │   │   ├── Order.cshtml
│   │   │   ├── Orders.cshtml
│   │   │   ├── Products.cshtml
│   │   │   ├── Roles.cshtml
│   │   │   └── UserAccounts.cshtml
│   │   ├── Home/
│   │   │   ├── About.cshtml
│   │   │   ├── Category.cshtml
│   │   │   ├── Checkout.cshtml
│   │   │   ├── Contact.cshtml
│   │   │   ├── Index.cshtml
│   │   │   ├── Order.cshtml
│   │   │   ├── Orders.cshtml
│   │   │   ├── ProductDetail.cshtml
│   │   │   ├── ShoppingCart.cshtml
│   │   │   └── SuccessPage.cshtml
│   │   ├── Shared/
│   │   │   ├── CategoriesPartial.cshtml
│   │   │   ├── Error.cshtml
│   │   │   ├── NewProductsPartial.cshtml
│   │   │   ├── ProductsPartial.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _LoginPartial.cshtml
│   │   ├── Web.config
│   │   └── _ViewStart.cshtml
│   ├── Web.Debug.config
│   ├── Web.Release.config
│   ├── Web.config
│   └── packages.config
├── OnlineStore.sln
├── README.md
├── Scripts/
│   ├── dbo.Categories.data.sql
│   ├── dbo.ProductCategorizations.data.sql
│   ├── dbo.Products.data.sql
│   ├── dbo.Roles.sql
│   ├── dbo.UserRoles.data.sql
│   └── dbo.Users.data.sql
└── packages/
    ├── Antlr.3.4.1.9004/
    │   └── Antlr.3.4.1.9004.nupkg
    ├── Antlr.3.5.0.2/
    │   └── Antlr.3.5.0.2.nupkg
    ├── AutoMapper.3.3.1/
    │   ├── AutoMapper.3.3.1.nupkg
    │   ├── lib/
    │   │   ├── MonoAndroid/
    │   │   │   └── AutoMapper.xml
    │   │   ├── MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── net40/
    │   │   │   └── AutoMapper.xml
    │   │   ├── portable-windows8+net40+wp8+sl5+MonoAndroid+MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── portable-windows8+net40+wp8+wpa81+sl5+MonoAndroid+MonoTouch/
    │   │   │   └── AutoMapper.xml
    │   │   ├── sl5/
    │   │   │   └── AutoMapper.xml
    │   │   ├── windows8/
    │   │   │   └── AutoMapper.xml
    │   │   ├── wp8/
    │   │   │   └── AutoMapper.xml
    │   │   └── wpa81/
    │   │       └── AutoMapper.xml
    │   └── tools/
    │       ├── AutoMapper.targets
    │       ├── MonoAndroid/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── MonoTouch/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── net40/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── sl5/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── windows8/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       ├── wp8/
    │       │   ├── Install.ps1
    │       │   └── uninstall.ps1
    │       └── wpa81/
    │           ├── Install.ps1
    │           └── uninstall.ps1
    ├── CommonServiceLocator.1.3/
    │   ├── CommonServiceLocator.1.3.nupkg
    │   └── lib/
    │       └── portable-net4+sl5+netcore45+wpa81+wp8/
    │           └── Microsoft.Practices.ServiceLocation.XML
    ├── DotNetOpenAuth.AspNet.4.0.3.12153/
    │   ├── DotNetOpenAuth.AspNet.4.0.3.12153.nupkg
    │   └── lib/
    │       └── net40-full/
    │           └── DotNetOpenAuth.AspNet.xml
    ├── DotNetOpenAuth.AspNet.4.3.0.13117/
    │   ├── DotNetOpenAuth.AspNet.4.3.0.13117.nupkg
    │   └── lib/
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.AspNet.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.AspNet.xml
    ├── DotNetOpenAuth.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.Core.xml
    ├── DotNetOpenAuth.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.Core.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.Core.xml
    ├── DotNetOpenAuth.OAuth.Consumer.4.0.3.12153/
    │   ├── DotNetOpenAuth.OAuth.Consumer.4.0.3.12153.nupkg
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OAuth.Consumer.xml
    ├── DotNetOpenAuth.OAuth.Consumer.4.3.0.13117/
    │   ├── DotNetOpenAuth.OAuth.Consumer.4.3.0.13117.nupkg
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OAuth.Consumer.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OAuth.Consumer.xml
    ├── DotNetOpenAuth.OAuth.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.OAuth.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OAuth.xml
    ├── DotNetOpenAuth.OAuth.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.OAuth.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OAuth.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OAuth.xml
    ├── DotNetOpenAuth.OpenId.Core.4.0.3.12153/
    │   ├── DotNetOpenAuth.OpenId.Core.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       └── net40-full/
    │           ├── DotNetOpenAuth.OpenId.xml
    │           ├── Mono.Math.xml
    │           └── Org.Mentalis.Security.Cryptography.xml
    ├── DotNetOpenAuth.OpenId.Core.4.3.0.13117/
    │   ├── DotNetOpenAuth.OpenId.Core.4.3.0.13117.nupkg
    │   ├── content/
    │   │   ├── net35-full/
    │   │   │   └── web.config.transform
    │   │   ├── net40-full/
    │   │   │   └── web.config.transform
    │   │   └── net45-full/
    │   │       └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       ├── net40-full/
    │       │   ├── DotNetOpenAuth.OpenId.xml
    │       │   ├── Mono.Math.xml
    │       │   └── Org.Mentalis.Security.Cryptography.xml
    │       └── net45-full/
    │           ├── DotNetOpenAuth.OpenId.xml
    │           ├── Mono.Math.xml
    │           └── Org.Mentalis.Security.Cryptography.xml
    ├── DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153/
    │   ├── DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       └── net40-full/
    │           └── DotNetOpenAuth.OpenId.RelyingParty.xml
    ├── DotNetOpenAuth.OpenId.RelyingParty.4.3.0.13117/
    │   ├── DotNetOpenAuth.OpenId.RelyingParty.4.3.0.13117.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       ├── net35-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       ├── net40-full/
    │       │   └── DotNetOpenAuth.OpenId.RelyingParty.xml
    │       └── net45-full/
    │           └── DotNetOpenAuth.OpenId.RelyingParty.xml
    ├── EnterpriseLibrary.Caching.5.0.505.0/
    │   ├── EnterpriseLibrary.Caching.5.0.505.0.nupkg
    │   ├── lib/
    │   │   ├── NET35/
    │   │   │   └── Microsoft.Practices.EnterpriseLibrary.Caching.xml
    │   │   └── SL40/
    │   │       └── Microsoft.Practices.EnterpriseLibrary.Caching.Silverlight.xml
    │   └── tools/
    │       ├── Utils.psm1
    │       └── install.ps1
    ├── EnterpriseLibrary.Common.5.0.505.0/
    │   ├── EnterpriseLibrary.Common.5.0.505.0.nupkg
    │   ├── lib/
    │   │   ├── NET35/
    │   │   │   └── Microsoft.Practices.EnterpriseLibrary.Common.xml
    │   │   └── SL40/
    │   │       └── Microsoft.Practices.EnterpriseLibrary.Common.Silverlight.xml
    │   └── tools/
    │       ├── Utils.psm1
    │       └── install.ps1
    ├── EntityFramework.5.0.0/
    │   ├── Content/
    │   │   ├── App.config.transform
    │   │   └── Web.config.transform
    │   ├── EntityFramework.5.0.0.nupkg
    │   ├── lib/
    │   │   ├── net40/
    │   │   │   └── EntityFramework.xml
    │   │   └── net45/
    │   │       └── EntityFramework.xml
    │   └── tools/
    │       ├── EntityFramework.PS3.psd1
    │       ├── EntityFramework.psd1
    │       ├── EntityFramework.psm1
    │       ├── Redirect.VS11.config
    │       ├── Redirect.config
    │       ├── about_EntityFramework.help.txt
    │       ├── init.ps1
    │       └── install.ps1
    ├── EntityFramework.6.1.3/
    │   ├── EntityFramework.6.1.3.nupkg
    │   ├── content/
    │   │   ├── App.config.transform
    │   │   └── Web.config.transform
    │   ├── lib/
    │   │   ├── net40/
    │   │   │   ├── EntityFramework.SqlServer.xml
    │   │   │   └── EntityFramework.xml
    │   │   └── net45/
    │   │       ├── EntityFramework.SqlServer.xml
    │   │       └── EntityFramework.xml
    │   └── tools/
    │       ├── EntityFramework.psd1
    │       ├── EntityFramework.psm1
    │       ├── about_EntityFramework.help.txt
    │       ├── init.ps1
    │       └── install.ps1
    ├── Microsoft.AspNet.Mvc.4.0.20710.0/
    │   ├── Microsoft.AspNet.Mvc.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Mvc.xml
    ├── Microsoft.AspNet.Razor.2.0.20710.0/
    │   ├── Microsoft.AspNet.Razor.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Razor.xml
    ├── Microsoft.AspNet.Web.Optimization.1.0.0/
    │   └── Microsoft.AspNet.Web.Optimization.1.0.0.nupkg
    ├── Microsoft.AspNet.WebApi.4.0.20710.0/
    │   └── Microsoft.AspNet.WebApi.4.0.20710.0.nupkg
    ├── Microsoft.AspNet.WebApi.Client.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.Client.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Net.Http.Formatting.xml
    ├── Microsoft.AspNet.WebApi.Core.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.Core.4.0.20710.0.nupkg
    │   ├── content/
    │   │   └── web.config.transform
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Http.xml
    ├── Microsoft.AspNet.WebApi.WebHost.4.0.20710.0/
    │   ├── Microsoft.AspNet.WebApi.WebHost.4.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── System.Web.Http.WebHost.xml
    ├── Microsoft.AspNet.WebPages.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           ├── System.Web.Helpers.xml
    │           ├── System.Web.WebPages.Deployment.xml
    │           ├── System.Web.WebPages.Razor.xml
    │           └── System.Web.WebPages.xml
    ├── Microsoft.AspNet.WebPages.Data.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.Data.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── WebMatrix.Data.xml
    ├── Microsoft.AspNet.WebPages.OAuth.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.OAuth.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── Microsoft.Web.WebPages.OAuth.xml
    ├── Microsoft.AspNet.WebPages.WebData.2.0.20710.0/
    │   ├── Microsoft.AspNet.WebPages.WebData.2.0.20710.0.nupkg
    │   └── lib/
    │       └── net40/
    │           └── WebMatrix.WebData.xml
    ├── Microsoft.Net.Http.2.0.20710.0/
    │   ├── Microsoft.Net.Http.2.0.20710.0.nupkg
    │   └── lib/
    │       ├── net40/
    │       │   ├── System.Net.Http.WebRequest.xml
    │       │   └── System.Net.Http.xml
    │       └── net45/
    │           └── _._
    ├── Microsoft.Web.Infrastructure.1.0.0.0/
    │   └── Microsoft.Web.Infrastructure.1.0.0.0.nupkg
    ├── Microsoft.jQuery.Unobtrusive.Ajax.2.0.20710.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── jquery.unobtrusive-ajax.js
    │   └── Microsoft.jQuery.Unobtrusive.Ajax.2.0.20710.0.nupkg
    ├── Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── jquery.validate.unobtrusive.js
    │   └── Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0.nupkg
    ├── Modernizr.2.5.3/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       └── modernizr-2.5.3.js
    │   └── Modernizr.2.5.3.nupkg
    ├── Newtonsoft.Json.4.5.6/
    │   ├── Newtonsoft.Json.4.5.6.nupkg
    │   └── lib/
    │       ├── net20/
    │       │   └── Newtonsoft.Json.xml
    │       ├── net35/
    │       │   └── Newtonsoft.Json.xml
    │       ├── net40/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl3-wp/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl4/
    │       │   └── Newtonsoft.Json.xml
    │       ├── sl4-windowsphone71/
    │       │   └── Newtonsoft.Json.xml
    │       └── winrt45/
    │           └── Newtonsoft.Json.xml
    ├── Unity.3.5.1404.0/
    │   ├── Unity.3.5.1404.0.nupkg
    │   ├── UnityConfiguration30.xsd
    │   └── lib/
    │       ├── net45/
    │       │   ├── Microsoft.Practices.Unity.Configuration.XML
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │       │   └── Microsoft.Practices.Unity.xml
    │       ├── portable-net45+wp80+win8+MonoAndroid10+MonoTouch10/
    │       │   └── Microsoft.Practices.Unity.xml
    │       ├── win8/
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │       │   ├── Microsoft.Practices.Unity.RegistrationByConvention.pri
    │       │   └── Microsoft.Practices.Unity.xml
    │       └── wp80/
    │           ├── Microsoft.Practices.Unity.RegistrationByConvention.XML
    │           └── Microsoft.Practices.Unity.xml
    ├── Unity.Interception.3.5.1404.0/
    │   ├── Unity.Interception.3.5.1404.0.nupkg
    │   └── lib/
    │       └── Net45/
    │           ├── Microsoft.Practices.Unity.Interception.Configuration.xml
    │           └── Microsoft.Practices.Unity.Interception.xml
    ├── WebGrease.1.1.0/
    │   └── WebGrease.1.1.0.nupkg
    ├── jQuery.1.7.1.1/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── jquery-1.7.1-vsdoc.js
    │   │       └── jquery-1.7.1.js
    │   ├── Tools/
    │   │   ├── common.ps1
    │   │   ├── install.ps1
    │   │   ├── jquery-1.7.1.intellisense.js
    │   │   └── uninstall.ps1
    │   └── jQuery.1.7.1.1.nupkg
    ├── jQuery.UI.Combined.1.8.20.1/
    │   ├── Content/
    │   │   ├── Content/
    │   │   │   └── themes/
    │   │   │       └── base/
    │   │   │           ├── jquery-ui.css
    │   │   │           ├── jquery.ui.accordion.css
    │   │   │           ├── jquery.ui.all.css
    │   │   │           ├── jquery.ui.autocomplete.css
    │   │   │           ├── jquery.ui.base.css
    │   │   │           ├── jquery.ui.button.css
    │   │   │           ├── jquery.ui.core.css
    │   │   │           ├── jquery.ui.datepicker.css
    │   │   │           ├── jquery.ui.dialog.css
    │   │   │           ├── jquery.ui.progressbar.css
    │   │   │           ├── jquery.ui.resizable.css
    │   │   │           ├── jquery.ui.selectable.css
    │   │   │           ├── jquery.ui.slider.css
    │   │   │           ├── jquery.ui.tabs.css
    │   │   │           └── jquery.ui.theme.css
    │   │   └── Scripts/
    │   │       └── jquery-ui-1.8.20.js
    │   └── jQuery.UI.Combined.1.8.20.1.nupkg
    ├── jQuery.Validation.1.9.0.1/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── jquery.validate-vsdoc.js
    │   │       └── jquery.validate.js
    │   └── jQuery.Validation.1.9.0.1.nupkg
    ├── knockoutjs.2.1.0/
    │   ├── Content/
    │   │   └── Scripts/
    │   │       ├── knockout-2.1.0.debug.js
    │   │       └── knockout-2.1.0.js
    │   └── knockoutjs.2.1.0.nupkg
    ├── log4net.2.0.3/
    │   ├── lib/
    │   │   ├── net10-full/
    │   │   │   └── log4net.xml
    │   │   ├── net11-full/
    │   │   │   └── log4net.xml
    │   │   ├── net20-full/
    │   │   │   └── log4net.xml
    │   │   ├── net35-client/
    │   │   │   └── log4net.xml
    │   │   ├── net35-full/
    │   │   │   └── log4net.xml
    │   │   ├── net40-client/
    │   │   │   └── log4net.xml
    │   │   └── net40-full/
    │   │       └── log4net.xml
    │   └── log4net.2.0.3.nupkg
    └── repositories.config
Download .txt
SYMBOL INDEX (1287 symbols across 163 files)

FILE: OnlineStore.Application/AddressResolver.cs
  class AddressResolver (line 7) | public class AddressResolver : ValueResolver<AddressDto, Address>
    method ResolveCore (line 9) | protected override Address ResolveCore(AddressDto source)

FILE: OnlineStore.Application/ApplicationService.cs
  class ApplicationService (line 14) | public abstract class ApplicationService
    method ApplicationService (line 18) | protected ApplicationService(IRepositoryContext repositoryContext)
    method IsEmptyGuidString (line 31) | protected bool IsEmptyGuidString(string s)
    method PerformCreateObjects (line 41) | protected TDtoList PerformCreateObjects<TDtoList, TDto, TAggregateRoot...
    method PerformUpdateObjects (line 72) | protected TDtoList PerformUpdateObjects<TDtoList, TDataObject, TAggreg...
    method PerformDeleteObjects (line 108) | protected void PerformDeleteObjects<TAggregateRoot>(IList<string> ids,...
    method Initialize (line 132) | public static void Initialize()

FILE: OnlineStore.Application/Global.asax.cs
  class Global (line 7) | public class Global : HttpApplication
    method Application_Start (line 9) | protected void Application_Start(object sender, EventArgs e)
    method Session_Start (line 16) | protected void Session_Start(object sender, EventArgs e)
    method Application_BeginRequest (line 21) | protected void Application_BeginRequest(object sender, EventArgs e)
    method Application_AuthenticateRequest (line 26) | protected void Application_AuthenticateRequest(object sender, EventArg...
    method Application_Error (line 31) | protected void Application_Error(object sender, EventArgs e)
    method Session_End (line 36) | protected void Session_End(object sender, EventArgs e)
    method Application_End (line 41) | protected void Application_End(object sender, EventArgs e)

FILE: OnlineStore.Application/InversedAddressResolver.cs
  class InversedAddressResolver (line 7) | public class InversedAddressResolver : ValueResolver<Address, AddressDto>
    method ResolveCore (line 9) | protected override AddressDto ResolveCore(Address source)

FILE: OnlineStore.Application/OrderService.svc.cs
  class OrderService (line 14) | [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    method OrderService (line 19) | public OrderService()
    method AddProductToCart (line 24) | public void AddProductToCart(Guid customerId, Guid productId, int quan...
    method GetShoppingCart (line 36) | public ShoppingCartDto GetShoppingCart(Guid customerId)
    method GetShoppingCartItemCount (line 48) | public int GetShoppingCartItemCount(Guid userId)
    method UpdateShoppingCartItem (line 60) | public void UpdateShoppingCartItem(Guid shoppingCartItemId, int quantity)
    method DeleteShoppingCartItem (line 72) | public void DeleteShoppingCartItem(Guid shoppingCartItemId)
    method Checkout (line 84) | public OrderDto Checkout(Guid customerId)
    method GetOrder (line 97) | public OrderDto GetOrder(Guid orderId)
    method GetOrdersForUser (line 109) | public IList<OrderDto> GetOrdersForUser(Guid userId)
    method GetAllOrders (line 121) | public IList<OrderDto> GetAllOrders()
    method Confirm (line 133) | public void Confirm(Guid orderId)
    method Dispatch (line 145) | public void Dispatch(Guid orderId)

FILE: OnlineStore.Application/ProductService.svc.cs
  class ProductService (line 11) | [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    method ProductService (line 17) | public ProductService()
    method GetProducts (line 22) | public IEnumerable<ProductDto> GetProducts()
    method GetProductsForCategory (line 34) | public IEnumerable<ProductDto> GetProductsForCategory(Guid categoryId)
    method GetNewProducts (line 46) | public IEnumerable<ProductDto> GetNewProducts(int count)
    method GetCategoryById (line 58) | public CategoryDto GetCategoryById(Guid id)
    method GetCategories (line 70) | public IEnumerable<CategoryDto> GetCategories()
    method GetProductById (line 82) | public ProductDto GetProductById(Guid id)
    method CreateProducts (line 94) | public List<ProductDto> CreateProducts(List<ProductDto> productsDtos)
    method CreateCategories (line 106) | public List<CategoryDto> CreateCategories(List<CategoryDto> categoriDtos)
    method UpdateProducts (line 118) | public List<ProductDto> UpdateProducts(List<ProductDto> productsDtos)
    method UpdateCategories (line 130) | public List<CategoryDto> UpdateCategories(List<CategoryDto> categoriDtos)
    method DeleteProducts (line 142) | public void DeleteProducts(List<string> produtList)
    method DeleteCategories (line 154) | public void DeleteCategories(List<string> categoryList)
    method CategorizeProduct (line 166) | public ProductCategorizationDto CategorizeProduct(Guid productId, Guid...
    method UncategorizeProduct (line 178) | public void UncategorizeProduct(Guid productId)
    method GetProductsWithPagination (line 190) | public ProductDtoWithPagination GetProductsWithPagination(Pagination p...
    method GetProductsForCategoryWithPagination (line 202) | public ProductDtoWithPagination GetProductsForCategoryWithPagination(G...

FILE: OnlineStore.Application/ServiceImplementations/OrderServiceImp.cs
  class OrderServiceImp (line 18) | public class OrderServiceImp : ApplicationService, IOrderService
    method OrderServiceImp (line 31) | public OrderServiceImp(IRepositoryContext context,
    method AddProductToCart (line 53) | public void AddProductToCart(Guid customerId, Guid productId, int quan...
    method GetShoppingCart (line 83) | public ShoppingCartDto GetShoppingCart(Guid customerId)
    method GetShoppingCartItemCount (line 109) | public int GetShoppingCartItemCount(Guid userId)
    method UpdateShoppingCartItem (line 120) | public void UpdateShoppingCartItem(Guid shoppingCartItemId, int quantity)
    method DeleteShoppingCartItem (line 128) | public void DeleteShoppingCartItem(Guid shoppingCartItemId)
    method Checkout (line 135) | public OrderDto Checkout(Guid customerId)
    method GetOrder (line 144) | public OrderDto GetOrder(Guid orderId)
    method GetOrdersForUser (line 151) | public IList<OrderDto> GetOrdersForUser(Guid userId)
    method GetAllOrders (line 162) | public IList<OrderDto> GetAllOrders()
    method Confirm (line 172) | public void Confirm(Guid orderId)
    method Dispatch (line 186) | public void Dispatch(Guid orderId)

FILE: OnlineStore.Application/ServiceImplementations/ProductServiceImp.cs
  class ProductServiceImp (line 15) | public class ProductServiceImp : ApplicationService, IProductService
    method ProductServiceImp (line 25) | public ProductServiceImp(IRepositoryContext context,
    method GetProducts (line 40) | public IEnumerable<ProductDto> GetProducts()
    method GetProductsWithPagination (line 62) | public ProductDtoWithPagination GetProductsWithPagination(Pagination p...
    method GetProductsForCategory (line 77) | public IEnumerable<ProductDto> GetProductsForCategory(Guid categoryId)
    method GetProductsForCategoryWithPagination (line 87) | public ProductDtoWithPagination GetProductsForCategoryWithPagination(G...
    method GetNewProducts (line 113) | public IEnumerable<ProductDto> GetNewProducts(int count)
    method GetCategoryById (line 126) | public CategoryDto GetCategoryById(Guid id)
    method GetCategories (line 134) | public IEnumerable<CategoryDto> GetCategories()
    method GetProductById (line 147) | public ProductDto GetProductById(Guid id)
    method CreateProducts (line 156) | public List<ProductDto> CreateProducts(List<ProductDto> productsDtos)
    method CreateCategories (line 161) | public List<CategoryDto> CreateCategories(List<CategoryDto> categoriDtos)
    method UpdateProducts (line 166) | public List<ProductDto> UpdateProducts(List<ProductDto> productsDtos)
    method UpdateCategories (line 186) | public List<CategoryDto> UpdateCategories(List<CategoryDto> categoriDtos)
    method DeleteProducts (line 200) | public void DeleteProducts(List<string> produList)
    method DeleteCategories (line 212) | public void DeleteCategories(List<string> categoryList)
    method CategorizeProduct (line 224) | public ProductCategorizationDto CategorizeProduct(Guid productId, Guid...
    method UncategorizeProduct (line 235) | public void UncategorizeProduct(Guid productId)

FILE: OnlineStore.Application/ServiceImplementations/UserServiceImp.cs
  class UserServiceImp (line 15) | public class UserServiceImp :ApplicationService, IUserService
    method UserServiceImp (line 23) | public UserServiceImp(IRepositoryContext repositoryContext,
    method CreateUsers (line 39) | public IList<UserDto> CreateUsers(List<UserDto> userDtos)
    method ValidateUser (line 57) | public bool ValidateUser(string userName, string password)
    method DisableUser (line 67) | public bool DisableUser(UserDto userDto)
    method EnableUser (line 86) | public bool EnableUser(UserDto userDto)
    method UpdateUsers (line 105) | public IList<UserDto> UpdateUsers(List<UserDto> userDataObjects)
    method DeleteUsers (line 161) | public void DeleteUsers(List<UserDto> userDtos)
    method GetUserByKey (line 185) | public UserDto GetUserByKey(Guid id)
    method GetUserByEmail (line 192) | public UserDto GetUserByEmail(string email)
    method GetUserByName (line 201) | public UserDto GetUserByName(string userName)
    method GetUsers (line 211) | public IList<UserDto> GetUsers()
    method GetRoles (line 232) | public IList<RoleDto> GetRoles()
    method GetRoleByKey (line 241) | public RoleDto GetRoleByKey(Guid id)
    method CreateRoles (line 246) | public IList<RoleDto> CreateRoles(List<RoleDto> roleDataObjects)
    method UpdateRoles (line 251) | public IList<RoleDto> UpdateRoles(List<RoleDto> roleDataObjects)
    method DeleteRoles (line 269) | public void DeleteRoles(List<string> roleList)
    method AssignRole (line 281) | public void AssignRole(Guid userId, Guid roleId)
    method UnassignRole (line 288) | public void UnassignRole(Guid userId)
    method GetRoleByUserName (line 295) | public RoleDto GetRoleByUserName(string userName)
    method GetOrdersForUser (line 302) | public IList<OrderDto> GetOrdersForUser(string userName)

FILE: OnlineStore.Application/UserService.svc.cs
  class UserService (line 14) | [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    method UserService (line 19) | public UserService()
    method CreateUsers (line 24) | public IList<UserDto> CreateUsers(List<UserDto> userDtos)
    method ValidateUser (line 36) | public bool ValidateUser(string userName, string password)
    method DisableUser (line 48) | public bool DisableUser(UserDto userDto)
    method EnableUser (line 60) | public bool EnableUser(UserDto userDto)
    method DeleteUsers (line 72) | public void DeleteUsers(List<UserDto> userDtos)
    method UpdateUsers (line 84) | public IList<UserDto> UpdateUsers(List<UserDto> userDataObjects)
    method GetUserByKey (line 96) | public UserDto GetUserByKey(Guid id)
    method GetUserByEmail (line 108) | public UserDto GetUserByEmail(string email)
    method GetUserByName (line 120) | public UserDto GetUserByName(string userName)
    method GetUsers (line 132) | public IList<UserDto> GetUsers()
    method GetRoles (line 144) | public IList<RoleDto> GetRoles()
    method GetRoleByKey (line 156) | public RoleDto GetRoleByKey(Guid id)
    method CreateRoles (line 168) | public IList<RoleDto> CreateRoles(List<RoleDto> roleDataObjects)
    method UpdateRoles (line 180) | public IList<RoleDto> UpdateRoles(List<RoleDto> roleDataObjects)
    method DeleteRoles (line 192) | public void DeleteRoles(List<string> roleList)
    method AssignRole (line 204) | public void AssignRole(Guid userId, Guid roleId)
    method UnassignRole (line 216) | public void UnassignRole(Guid userId)
    method GetRoleByUserName (line 228) | public RoleDto GetRoleByUserName(string userName)
    method GetOrdersForUser (line 240) | public IList<OrderDto> GetOrdersForUser(string userName)

FILE: OnlineStore.Domain/DomainException.cs
  class DomainException (line 6) | public class DomainException : Exception
    method DomainException (line 9) | public DomainException() : base()
    method DomainException (line 13) | public DomainException(string message) : base(message)
    method DomainException (line 16) | public DomainException(string message, Exception innerException) : bas...
    method DomainException (line 18) | public DomainException(string format, params object[] args) : base(str...
    method DomainException (line 20) | protected DomainException(SerializationInfo info, StreamingContext con...

FILE: OnlineStore.Domain/Events/DomainEvent.cs
  class DomainEvent (line 11) | [SuppressMessage("ReSharper", "AccessToForEachVariableInClosure")]
    method DomainEvent (line 23) | public DomainEvent()
    method DomainEvent (line 27) | public DomainEvent(IEntity source)
    method Handle (line 55) | public static void Handle<TDomainEvent>(TDomainEvent domainEvent)
    method Handle (line 69) | public static void Handle<TDomainEvent>(TDomainEvent domainEvent, Acti...

FILE: OnlineStore.Domain/Events/EventHandlers/OrderConfirmedEventHandler.cs
  class OrderConfirmedEventHandler (line 7) | public class OrderConfirmedEventHandler : IDomainEventHandler<OrderConfi...
    method OrderConfirmedEventHandler (line 11) | public OrderConfirmedEventHandler(IEventBus bus)
    method Handle (line 18) | public void Handle(OrderConfirmedEvent @event)

FILE: OnlineStore.Domain/Events/EventHandlers/OrderDispatchedEventHandler.cs
  class OrderDispatchedEventHandler (line 8) | public class OrderDispatchedEventHandler : IDomainEventHandler<OrderDisp...
    method OrderDispatchedEventHandler (line 13) | public OrderDispatchedEventHandler(IEventBus bus)
    method Handle (line 18) | public void Handle(OrderDispatchedEvent @event)

FILE: OnlineStore.Domain/Events/IDomainEvent.cs
  type IDomainEvent (line 5) | public interface IDomainEvent : IEvent

FILE: OnlineStore.Domain/Events/IDomainEventHandler.cs
  type IDomainEventHandler (line 8) | public interface IDomainEventHandler<in TDomainEvent> : IEventHandler<TD...

FILE: OnlineStore.Domain/Events/OrderConfirmedEvent.cs
  class OrderConfirmedEvent (line 5) | [Serializable]
    method OrderConfirmedEvent (line 9) | public OrderConfirmedEvent() { }
    method OrderConfirmedEvent (line 10) | public OrderConfirmedEvent(IEntity source) : base(source) { }

FILE: OnlineStore.Domain/Events/OrderDispatchedEvent.cs
  class OrderDispatchedEvent (line 5) | [Serializable]
    method OrderDispatchedEvent (line 9) | public OrderDispatchedEvent() { }
    method OrderDispatchedEvent (line 10) | public OrderDispatchedEvent(IEntity source) : base(source) { }

FILE: OnlineStore.Domain/IAggregateRoot.cs
  type IAggregateRoot (line 10) | public interface IAggregateRoot : IEntity

FILE: OnlineStore.Domain/IEntity.cs
  type IEntity (line 10) | public interface IEntity

FILE: OnlineStore.Domain/Model/Address.cs
  class Address (line 5) | public class Address
    method Equals (line 23) | public override bool Equals(object obj)
    method GetHashCode (line 40) | public override int GetHashCode()
    method ToString (line 49) | public override string ToString()

FILE: OnlineStore.Domain/Model/AggregateRoot.cs
  class AggregateRoot (line 5) | public abstract class AggregateRoot : IAggregateRoot
    method Equals (line 15) | public override bool Equals(object obj)
    method GetHashCode (line 27) | public override int GetHashCode()

FILE: OnlineStore.Domain/Model/Category.cs
  class Category (line 5) | public class Category : AggregateRoot
    method ToString (line 11) | public override string ToString()

FILE: OnlineStore.Domain/Model/Order.cs
  class Order (line 9) | public class Order : AggregateRoot
    method Order (line 66) | public Order()
    method Confirm (line 78) | public void Confirm()
    method Dispatch (line 87) | public void Dispatch()

FILE: OnlineStore.Domain/Model/OrderItem.cs
  class OrderItem (line 5) | public class OrderItem : IEntity
    method Equals (line 26) | public override bool Equals(object obj)
    method GetHashCode (line 38) | public override int GetHashCode()

FILE: OnlineStore.Domain/Model/OrderStatus.cs
  type OrderStatus (line 4) | public enum OrderStatus

FILE: OnlineStore.Domain/Model/Product.cs
  class Product (line 5) | public class Product : AggregateRoot
    method ToString (line 17) | public override string ToString()

FILE: OnlineStore.Domain/Model/ProductCategorization.cs
  class ProductCategorization (line 5) | public class ProductCategorization : AggregateRoot
    method ProductCategorization (line 7) | public ProductCategorization()
    method ProductCategorization (line 10) | public ProductCategorization(Guid productId, Guid categoryId)
    method ToString (line 20) | public override string ToString()
    method CreateCategorization (line 26) | public static ProductCategorization CreateCategorization(Product produ...

FILE: OnlineStore.Domain/Model/Role.cs
  class Role (line 4) | public class Role : AggregateRoot

FILE: OnlineStore.Domain/Model/ShoppingCart.cs
  class ShoppingCart (line 4) | public class ShoppingCart : AggregateRoot

FILE: OnlineStore.Domain/Model/ShoppingCartItem.cs
  class ShoppingCartItem (line 9) | public class ShoppingCartItem : AggregateRoot
    method ConvertToOrderItem (line 28) | public OrderItem ConvertToOrderItem()
    method UpdateQuantity (line 39) | public void UpdateQuantity(int quantity)

FILE: OnlineStore.Domain/Model/User.cs
  class User (line 8) | public class User : AggregateRoot
    method ToString (line 44) | public override string ToString()
    method Disable (line 51) | public void Disable()
    method Enable (line 56) | public void Enable()
    method CreateShoppingCart (line 62) | public ShoppingCart CreateShoppingCart()

FILE: OnlineStore.Domain/Model/UserRole.cs
  class UserRole (line 5) | public class UserRole : AggregateRoot
    method CreateUserRole (line 11) | public static UserRole CreateUserRole(User user, Role role)

FILE: OnlineStore.Domain/Repositories/ICategoryRepository.cs
  type ICategoryRepository (line 7) | public interface ICategoryRepository : IRepository<Category>

FILE: OnlineStore.Domain/Repositories/IOrderRepository.cs
  type IOrderRepository (line 6) | public interface IOrderRepository : IRepository<Order>

FILE: OnlineStore.Domain/Repositories/IProductCategorizationRepository.cs
  type IProductCategorizationRepository (line 7) | public interface IProductCategorizationRepository : IRepository<ProductC...
    method GetProductsForCategory (line 10) | IEnumerable<Product> GetProductsForCategory(Category category);
    method GetProductsForCategoryWithPagination (line 19) | PagedResult<Product> GetProductsForCategoryWithPagination(Category cat...
    method GetCategoryForProduct (line 26) | Category GetCategoryForProduct(Product product);

FILE: OnlineStore.Domain/Repositories/IProductRepository.cs
  type IProductRepository (line 7) | public interface IProductRepository : IRepository<Product>
    method GetNewProducts (line 9) | IEnumerable<Product> GetNewProducts(int count = 0);

FILE: OnlineStore.Domain/Repositories/IRepository.cs
  type IRepository (line 13) | public interface IRepository<TAggregateRoot>
    method Add (line 17) | void Add(TAggregateRoot aggregateRoot);
    method GetByKey (line 20) | TAggregateRoot GetByKey(Guid key);
    method GetBySpecification (line 22) | TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot> spec);
    method GetByExpression (line 24) | TAggregateRoot GetByExpression(Expression<Func<TAggregateRoot, bool>> ...
    method GetAll (line 27) | IEnumerable<TAggregateRoot> GetAll();
    method GetAll (line 30) | IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dyn...
    method GetAll (line 33) | IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> spec...
    method GetAll (line 36) | IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> spec...
    method Exists (line 39) | bool Exists(ISpecification<TAggregateRoot> specification);
    method Remove (line 41) | void Remove(TAggregateRoot aggregateRoot);
    method Update (line 43) | void Update(TAggregateRoot aggregateRoot);
    method GetAll (line 47) | PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dyn...
    method GetAll (line 50) | PagedResult<TAggregateRoot> GetAll(
    method GetAll (line 55) | PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dyn...
    method GetAll (line 59) | PagedResult<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> spec...
    method GetBySpecification (line 66) | TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot> speci...
    method GetAll (line 67) | IEnumerable<TAggregateRoot> GetAll(params Expression<Func<TAggregateRo...
    method GetAll (line 69) | IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRoot, dyn...
    method GetAll (line 71) | IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> spec...
    method GetAll (line 73) | IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoot> spec...

FILE: OnlineStore.Domain/Repositories/IRepositoryContext.cs
  type IRepositoryContext (line 12) | public interface IRepositoryContext : IUnitOfWork
    method RegisterNew (line 17) | void RegisterNew<TAggregateRoot>(TAggregateRoot entity)
    method RegisterModified (line 20) | void RegisterModified<TAggregateRoot>(TAggregateRoot entity)
    method RegisterDeleted (line 23) | void RegisterDeleted<TAggregateRoot>(TAggregateRoot entity)

FILE: OnlineStore.Domain/Repositories/IRoleRepository.cs
  type IRoleRepository (line 5) | public interface IRoleRepository : IRepository<Role>

FILE: OnlineStore.Domain/Repositories/IShoppingCartItemRepository.cs
  type IShoppingCartItemRepository (line 6) | public interface IShoppingCartItemRepository : IRepository<ShoppingCartI...
    method FindItem (line 8) | ShoppingCartItem FindItem(ShoppingCart shoppingCart, Product product);

FILE: OnlineStore.Domain/Repositories/IShoppingCartRepository.cs
  type IShoppingCartRepository (line 5) | public interface IShoppingCartRepository : IRepository<ShoppingCart>

FILE: OnlineStore.Domain/Repositories/IUserRepository.cs
  type IUserRepository (line 6) | public interface IUserRepository : IRepository<User>
    method CheckPassword (line 8) | bool CheckPassword(string userName, string password);

FILE: OnlineStore.Domain/Repositories/IUserRoleRepository.cs
  type IUserRoleRepository (line 5) | public interface IUserRoleRepository : IRepository<UserRole>
    method GetRoleForUser (line 12) | Role GetRoleForUser(User user);

FILE: OnlineStore.Domain/Repositories/SortOrder.cs
  type SortOrder (line 3) | public enum SortOrder

FILE: OnlineStore.Domain/Services/DomainService.cs
  class DomainService (line 13) | public class DomainService : IDomainService
    method DomainService (line 25) | public DomainService(IRepositoryContext repositoryContext,
    method CreateOrder (line 52) | public Order CreateOrder(User user, ShoppingCart shoppingCart)
    method Categorize (line 77) | public ProductCategorization Categorize(Product product, Category cate...
    method Uncategorize (line 103) | public void Uncategorize(Product product, Category category = null)
    method AssignRole (line 119) | public UserRole AssignRole(User user, Role role)
    method UnassignRole (line 142) | public void UnassignRole(User user, Role role = null)

FILE: OnlineStore.Domain/Services/IDomainService.cs
  type IDomainService (line 6) | public interface IDomainService
    method CreateOrder (line 8) | Order CreateOrder(User user, ShoppingCart shoppingCart);
    method Categorize (line 16) | ProductCategorization Categorize(Product product, Category category);
    method Uncategorize (line 23) | void Uncategorize(Product product, Category category = null);
    method AssignRole (line 31) | UserRole AssignRole(User user, Role role);
    method UnassignRole (line 38) | void UnassignRole(User user, Role role = null);

FILE: OnlineStore.Domain/Specifications/AnySpecification.cs
  class AnySpecification (line 6) | public sealed class AnySpecification<T> : Specification<T>

FILE: OnlineStore.Domain/Specifications/ExpressionSpecification.cs
  class ExpressionSpecification (line 6) | public sealed class ExpressionSpecification<T> : Specification<T>
    method ExpressionSpecification (line 9) | public ExpressionSpecification(Expression<Func<T, bool>> expression)

FILE: OnlineStore.Domain/Specifications/ISpecification.cs
  type ISpecification (line 10) | public interface ISpecification<T>
    method IsSatisfiedBy (line 12) | bool IsSatisfiedBy(T candidate);

FILE: OnlineStore.Domain/Specifications/ParameterReplacer.cs
  class ParameterReplacer (line 5) | public class ParameterReplacer : ExpressionVisitor
    method ParameterReplacer (line 7) | public ParameterReplacer(ParameterExpression paramExpr)
    method Replace (line 14) | public Expression Replace(Expression expr)
    method VisitParameter (line 19) | protected override Expression VisitParameter(ParameterExpression p)

FILE: OnlineStore.Domain/Specifications/SpecExprExtensions.cs
  class SpecExprExtensions (line 6) | public static class SpecExprExtensions
    method Not (line 8) | public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T,...
    method And (line 16) | public static Expression<Func<T, bool>> And<T>(this Expression<Func<T,...
    method Or (line 32) | public static Expression<Func<T, bool>> Or<T>(

FILE: OnlineStore.Domain/Specifications/Specification.cs
  class Specification (line 11) | public abstract class Specification<T> : ISpecification<T>
    method Eval (line 13) | public static Specification<T> Eval(Expression<Func<T, bool>> expression)
    method IsSatisfiedBy (line 19) | public bool IsSatisfiedBy(T candidate)

FILE: OnlineStore.Events.Handlers/SendEmailHandler.cs
  class SendEmailHandler (line 7) | [HandlesAsynchronously]
    method Handle (line 11) | public void Handle(OrderConfirmedEvent @event)
    method Handle (line 28) | public void Handle(OrderDispatchedEvent @event)

FILE: OnlineStore.Events/Bus/EventBus.cs
  class EventBus (line 14) | public class EventBus : DisposableObject, IEventBus
    method EventBus (line 22) | public EventBus(IEventAggregator aggregator)
    method Dispose (line 36) | protected override void Dispose(bool disposing)
    method Publish (line 52) | public void Publish<TMessage>(TMessage message)
    method Publish (line 59) | public void Publish<TMessage>(IEnumerable<TMessage> messages)
    method Clear (line 66) | public void Clear()
    method Commit (line 87) | public void Commit()
    method Rollback (line 100) | public void Rollback()

FILE: OnlineStore.Events/Bus/IBus.cs
  type IBus (line 7) | public interface IBus : IUnitOfWork, IDisposable
    method Publish (line 11) | void Publish<TMessage>(TMessage message)
    method Publish (line 14) | void Publish<TMessage>(IEnumerable<TMessage> messages)
    method Clear (line 17) | void Clear();

FILE: OnlineStore.Events/Bus/IEventBus.cs
  type IEventBus (line 3) | public interface IEventBus : IBus

FILE: OnlineStore.Events/Bus/MsmqBusOptions.cs
  class MsmqBusOptions (line 5) | public class MsmqBusOptions
    method MsmqBusOptions (line 13) | public MsmqBusOptions(string path, bool sharedModeDenyReceive, bool en...
    method MsmqBusOptions (line 22) | public MsmqBusOptions(string path)
    method MsmqBusOptions (line 26) | public MsmqBusOptions(string path, bool useInternalTransaction)

FILE: OnlineStore.Events/Bus/MsmqEventBus.cs
  class MsmqEventBus (line 11) | public class MsmqEventBus : DisposableObject, IEventBus
    method MsmqEventBus (line 26) | public MsmqEventBus(string path)
    method Publish (line 57) | public void Publish<TMessage>(TMessage message) where TMessage : class...
    method Publish (line 65) | public void Publish<TMessage>(IEnumerable<TMessage> messages) where TM...
    method Clear (line 74) | public void Clear()
    method Commit (line 79) | public void Commit()
    method Dispose (line 131) | protected override void Dispose(bool disposing)
    method ConvertStringToType (line 142) | private Type ConvertStringToType(string sourceStr)

FILE: OnlineStore.Events/EventAggregator.cs
  class EventAggregator (line 10) | public class EventAggregator : IEventAggregator
    method EventAggregator (line 16) | public EventAggregator()
    method EventAggregator (line 30) | public EventAggregator(object[] handlers)
    method Register (line 52) | public void Register<TEvent>(IEventHandler<TEvent> eventHandler)
    method Register (line 75) | public void Register<TEvent>(IEnumerable<IEventHandler<TEvent>> eventH...
    method Handle (line 83) | public void Handle<TEvent>(TEvent evnt)
    method Handle (line 113) | public void Handle<TEvent>(TEvent evnt, Action<TEvent, bool, Exception...

FILE: OnlineStore.Events/HandlesAsynchronouslyAttribute.cs
  class HandlesAsynchronouslyAttribute (line 6) | [AttributeUsage(AttributeTargets.Class, Inherited = false)]

FILE: OnlineStore.Events/IEvent.cs
  type IEvent (line 6) | public interface IEvent

FILE: OnlineStore.Events/IEventAggregator.cs
  type IEventAggregator (line 6) | public interface IEventAggregator
    method Register (line 8) | void Register<TEvent>(IEventHandler<TEvent> domainEventHandler)
    method Register (line 10) | void Register<TEvent>(IEnumerable<IEventHandler<TEvent>> domainEventHa...
    method Handle (line 13) | void Handle<TEvent>(TEvent domainEvent)
    method Handle (line 15) | void Handle<TEvent>(TEvent domainEvent, Action<TEvent, bool, Exception...

FILE: OnlineStore.Events/IEventHandler.cs
  type IEventHandler (line 4) | public interface IEventHandler<in TEvent>
    method Handle (line 8) | void Handle(TEvent @event);

FILE: OnlineStore.Infrastructure/Caching/AppfabricCacheProvider.cs
  class AppfabricCacheProvider (line 11) | public class AppfabricCacheProvider : ICacheProvider
    method AppfabricCacheProvider (line 16) | public AppfabricCacheProvider()
    method Add (line 22) | public void Add(string key, string valueKey, object value)
    method Update (line 42) | public void Update(string key, string valueKey, object value)
    method Get (line 47) | public object Get(string key, string valueKey)
    method Remove (line 52) | public void Remove(string key)
    method Exists (line 57) | public bool Exists(string key)
    method Exists (line 62) | public bool Exists(string key, string valueKey)

FILE: OnlineStore.Infrastructure/Caching/CacheAttribute.cs
  class CacheAttribute (line 5) | [AttributeUsage(AttributeTargets.Method, Inherited = false)]
    method CacheAttribute (line 15) | public CacheAttribute(CachingMethod method)
    method CacheAttribute (line 20) | public CacheAttribute(CachingMethod method, params string[] correspond...

FILE: OnlineStore.Infrastructure/Caching/CachingMethod.cs
  type CachingMethod (line 6) | public enum CachingMethod

FILE: OnlineStore.Infrastructure/Caching/EntLibCacheProvider.cs
  class EntLibCacheProvider (line 10) | public class EntLibCacheProvider : ICacheProvider
    method Add (line 17) | public void Add(string key, string valueKey, object value)
    method Update (line 33) | public void Update(string key, string valueKey, object value)
    method Get (line 38) | public object Get(string key, string valueKey)
    method Remove (line 49) | public void Remove(string key)
    method Exists (line 55) | public bool Exists(string key)
    method Exists (line 61) | public bool Exists(string key, string valueKey)

FILE: OnlineStore.Infrastructure/Caching/ICacheProvider.cs
  type ICacheProvider (line 4) | public interface ICacheProvider
    method Add (line 12) | void Add(string key, string valueKey, object value);
    method Update (line 13) | void Update(string key, string valueKey, object value);
    method Get (line 14) | object Get(string key, string valueKey);
    method Remove (line 15) | void Remove(string key);
    method Exists (line 16) | bool Exists(string key);
    method Exists (line 17) | bool Exists(string key, string valueKey);

FILE: OnlineStore.Infrastructure/DisposableObject.cs
  class DisposableObject (line 5) | public abstract class DisposableObject :IDisposable
    method Dispose (line 12) | protected abstract void Dispose(bool disposing);
    method ExplicitDispose (line 14) | protected void ExplicitDispose()
    method Dispose (line 22) | public void Dispose()

FILE: OnlineStore.Infrastructure/IUnitOfWork.cs
  type IUnitOfWork (line 3) | public interface IUnitOfWork
    method Commit (line 5) | void Commit();

FILE: OnlineStore.Infrastructure/InterceptionBehaviors/CachingBehavior.cs
  class CachingBehavior (line 10) | public class CachingBehavior : IInterceptionBehavior
    method CachingBehavior (line 14) | public CachingBehavior()
    method GetValueKey (line 20) | private string GetValueKey(CacheAttribute cachingAttribute, IMethodInv...
    method GetRequiredInterfaces (line 51) | public IEnumerable<Type> GetRequiredInterfaces()
    method Invoke (line 56) | public IMethodReturn Invoke(IMethodInvocation input, GetNextIntercepti...

FILE: OnlineStore.Infrastructure/InterceptionBehaviors/ExceptionLoggingBehavior.cs
  class ExceptionLoggingBehavior (line 8) | public class ExceptionLoggingBehavior :IInterceptionBehavior
    method GetRequiredInterfaces (line 14) | public IEnumerable<Type> GetRequiredInterfaces()
    method Invoke (line 25) | public IMethodReturn Invoke(IMethodInvocation input, GetNextIntercepti...

FILE: OnlineStore.Infrastructure/PagedResult.cs
  class PagedResult (line 9) | public class PagedResult<T> : IEnumerable<T>, ICollection<T>
    method PagedResult (line 35) | public PagedResult()
    method PagedResult (line 40) | public PagedResult(int totalRecords, int totalPages, int pageSize, int...
    method Equals (line 56) | public override bool Equals(object obj)
    method GetHashCode (line 76) | public override int GetHashCode()
    method GetEnumerator (line 112) | public IEnumerator<T> GetEnumerator()
    method GetEnumerator (line 117) | IEnumerator IEnumerable.GetEnumerator()
    method Add (line 124) | public void Add(T item)
    method Clear (line 129) | public void Clear()
    method Contains (line 134) | public bool Contains(T item)
    method CopyTo (line 139) | public void CopyTo(T[] array, int arrayIndex)
    method Remove (line 154) | public bool Remove(T item)

FILE: OnlineStore.Infrastructure/ServiceLocator.cs
  class ServiceLocator (line 13) | [SuppressMessage("ReSharper", "CoVariantArrayConversion")]
    method ServiceLocator (line 19) | private ServiceLocator()
    method GetService (line 40) | public T GetService<T>()
    method Register (line 45) | public void Register<TFrom, TTo>() where TTo : TFrom
    method Register (line 50) | public void Register<TFrom, TTo>(string name) where TTo : TFrom
    method ResolveAll (line 55) | public IEnumerable<T> ResolveAll<T>()
    method GetService (line 60) | public T GetService<T>(object overridedArguments)
    method GetService (line 66) | public object GetService(Type serviceType, object overridedArguments)
    method GetParameterOverrides (line 75) | private IEnumerable<ParameterOverride> GetParameterOverrides(object ov...
    method GetService (line 93) | public object GetService(Type serviceType)

FILE: OnlineStore.Infrastructure/Utils.cs
  class Utils (line 8) | [SuppressMessage("ReSharper", "InconsistentNaming")]
    method Log (line 20) | public static void Log(string message)
    method Log (line 28) | public static void Log(Exception ex)
    method SendEmail (line 38) | public static void SendEmail(string to, string subject, string content)

FILE: OnlineStore.ModelDTO/Service References/OrderService/Reference.cs
  class AggregateRoot (line 16) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 57) | protected void RaisePropertyChanged(string propertyName) {
  class User (line 65) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  class Order (line 232) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  class Product (line 319) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  class ShoppingCart (line 406) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  class Address (line 429) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 530) | protected void RaisePropertyChanged(string propertyName) {
  class OrderItem (line 538) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 623) | protected void RaisePropertyChanged(string propertyName) {
  type IOrderService (line 631) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
    method AddProductToCart (line 635) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method AddProductToCartAsync (line 638) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetShoppingCart (line 641) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetShoppingCartAsync (line 644) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
  type IOrderServiceChannel (line 648) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
  class OrderServiceClient (line 652) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method OrderServiceClient (line 656) | public OrderServiceClient() {
    method OrderServiceClient (line 659) | public OrderServiceClient(string endpointConfigurationName) :
    method OrderServiceClient (line 663) | public OrderServiceClient(string endpointConfigurationName, string rem...
    method OrderServiceClient (line 667) | public OrderServiceClient(string endpointConfigurationName, System.Ser...
    method OrderServiceClient (line 671) | public OrderServiceClient(System.ServiceModel.Channels.Binding binding...
    method AddProductToCart (line 675) | public void AddProductToCart(System.Guid customerId, System.Guid produ...
    method AddProductToCartAsync (line 679) | public System.Threading.Tasks.Task AddProductToCartAsync(System.Guid c...
    method GetShoppingCart (line 683) | public OnlineStore.ModelDTO.OrderService.ShoppingCart GetShoppingCart(...
    method GetShoppingCartAsync (line 687) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.OrderService.S...

FILE: OnlineStore.ModelDTO/Service References/ProductService/Reference.cs
  class Product (line 16) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  class AggregateRoot (line 103) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 142) | protected void RaisePropertyChanged(string propertyName) {
  class Category (line 150) | [System.Diagnostics.DebuggerStepThroughAttribute()]
  type IProductService (line 189) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
    method GetProducts (line 193) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsAsync (line 196) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategory (line 199) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategoryAsync (line 202) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetNewProducts (line 205) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetNewProductsAsync (line 208) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategories (line 211) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategoriesAsync (line 214) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductById (line 217) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductByIdAsync (line 220) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
  type IProductServiceChannel (line 224) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
  class ProductServiceClient (line 228) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method ProductServiceClient (line 232) | public ProductServiceClient() {
    method ProductServiceClient (line 235) | public ProductServiceClient(string endpointConfigurationName) :
    method ProductServiceClient (line 239) | public ProductServiceClient(string endpointConfigurationName, string r...
    method ProductServiceClient (line 243) | public ProductServiceClient(string endpointConfigurationName, System.S...
    method ProductServiceClient (line 247) | public ProductServiceClient(System.ServiceModel.Channels.Binding bindi...
    method GetProducts (line 251) | public OnlineStore.ModelDTO.ProductService.Product[] GetProducts() {
    method GetProductsAsync (line 255) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.ProductService...
    method GetProductsForCategory (line 259) | public OnlineStore.ModelDTO.ProductService.Product[] GetProductsForCat...
    method GetProductsForCategoryAsync (line 263) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.ProductService...
    method GetNewProducts (line 267) | public OnlineStore.ModelDTO.ProductService.Product[] GetNewProducts(in...
    method GetNewProductsAsync (line 271) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.ProductService...
    method GetCategories (line 275) | public OnlineStore.ModelDTO.ProductService.Category[] GetCategories() {
    method GetCategoriesAsync (line 279) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.ProductService...
    method GetProductById (line 283) | public OnlineStore.ModelDTO.ProductService.Product GetProductById(Syst...
    method GetProductByIdAsync (line 287) | public System.Threading.Tasks.Task<OnlineStore.ModelDTO.ProductService...

FILE: OnlineStore.Repositories/EntityFramework/CategoryRepository.cs
  class CategoryRepository (line 10) | public class CategoryRepository : EntityFrameworkRepository<Category>, I...
    method CategoryRepository (line 13) | public CategoryRepository(IRepositoryContext context)

FILE: OnlineStore.Repositories/EntityFramework/EntityFrameworkRepository.cs
  class EntityFrameworkRepository (line 14) | public abstract class EntityFrameworkRepository<TAggregateRoot> : IRepos...
    method EntityFrameworkRepository (line 19) | protected EntityFrameworkRepository(IRepositoryContext context)
    method GetMemberInfo (line 26) | private MemberExpression GetMemberInfo(LambdaExpression lambda)
    method GetEagerLoadingPath (line 50) | private string GetEagerLoadingPath(Expression<Func<TAggregateRoot, dyn...
    method Add (line 64) | public void Add(TAggregateRoot aggregateRoot)
    method GetByKey (line 70) | public TAggregateRoot GetByKey(Guid key)
    method GetBySpecification (line 75) | public TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot...
    method GetByExpression (line 80) | public TAggregateRoot GetByExpression(Expression<Func<TAggregateRoot, ...
    method GetAll (line 85) | public IEnumerable<TAggregateRoot> GetAll()
    method GetAll (line 90) | public IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...
    method GetAll (line 96) | public IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRo...
    method GetAll (line 101) | public IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...
    method Exists (line 122) | public bool Exists(ISpecification<TAggregateRoot> specification)
    method Remove (line 128) | public void Remove(TAggregateRoot aggregateRoot)
    method Update (line 133) | public void Update(TAggregateRoot aggregateRoot)
    method GetBySpecification (line 139) | public TAggregateRoot GetBySpecification(ISpecification<TAggregateRoot...
    method GetAll (line 160) | public IEnumerable<TAggregateRoot> GetAll(params Expression<Func<TAggr...
    method GetAll (line 165) | public IEnumerable<TAggregateRoot> GetAll(Expression<Func<TAggregateRo...
    method GetAll (line 170) | public IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...
    method GetAll (line 175) | public IEnumerable<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...
    method GetAll (line 213) | public PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRo...
    method GetAll (line 219) | public PagedResult<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...
    method GetAll (line 253) | public PagedResult<TAggregateRoot> GetAll(Expression<Func<TAggregateRo...
    method GetAll (line 258) | public PagedResult<TAggregateRoot> GetAll(ISpecification<TAggregateRoo...

FILE: OnlineStore.Repositories/EntityFramework/EntityFrameworkRepositoryContext.cs
  class EntityFrameworkRepositoryContext (line 10) | public class EntityFrameworkRepositoryContext : IEntityFrameworkReposito...
    method RegisterNew (line 30) | public void RegisterNew<TAggregateRoot>(TAggregateRoot entity) where T...
    method RegisterModified (line 35) | public void RegisterModified<TAggregateRoot>(TAggregateRoot entity) wh...
    method RegisterDeleted (line 40) | public void RegisterDeleted<TAggregateRoot>(TAggregateRoot entity) whe...
    method Commit (line 48) | public void Commit()

FILE: OnlineStore.Repositories/EntityFramework/IEntityFrameworkRepositoryContext.cs
  type IEntityFrameworkRepositoryContext (line 5) | public interface IEntityFrameworkRepositoryContext : IRepositoryContext

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/CategoryTypeConfiguration.cs
  class CategoryTypeConfiguration (line 8) | public class CategoryTypeConfiguration : EntityTypeConfiguration<Category>
    method CategoryTypeConfiguration (line 10) | public CategoryTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/OrderItemTypeConfiguration.cs
  class OrderItemTypeConfiguration (line 8) | public class OrderItemTypeConfiguration : EntityTypeConfiguration<OrderI...
    method OrderItemTypeConfiguration (line 10) | public OrderItemTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/OrderTypeConfiguration.cs
  class OrderTypeConfiguration (line 8) | public class OrderTypeConfiguration : EntityTypeConfiguration<Order>
    method OrderTypeConfiguration (line 10) | public OrderTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/ProductCategorizationTypeConfiguration.cs
  class ProductCategorizationTypeConfiguration (line 8) | public class ProductCategorizationTypeConfiguration: EntityTypeConfigura...
    method ProductCategorizationTypeConfiguration (line 10) | public ProductCategorizationTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/ProductTypeConfiguration.cs
  class ProductTypeConfiguration (line 8) | public class ProductTypeConfiguration : EntityTypeConfiguration<Product>
    method ProductTypeConfiguration (line 12) | public ProductTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/RoleTypeConfiguration.cs
  class RoleTypeConfiguration (line 8) | public class RoleTypeConfiguration : EntityTypeConfiguration<Role>
    method RoleTypeConfiguration (line 10) | public RoleTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/ShoppingCartItemTypeConfiguration.cs
  class ShoppingCartItemTypeConfiguration (line 7) | public class ShoppingCartItemTypeConfiguration : EntityTypeConfiguration...
    method ShoppingCartItemTypeConfiguration (line 9) | public ShoppingCartItemTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/ShoppingCartTypeConfiguration.cs
  class ShoppingCartTypeConfiguration (line 7) | public class ShoppingCartTypeConfiguration : EntityTypeConfiguration<Sho...
    method ShoppingCartTypeConfiguration (line 9) | public ShoppingCartTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/UserRoleTypeConfiguration.cs
  class UserRoleTypeConfiguration (line 8) | public class UserRoleTypeConfiguration : EntityTypeConfiguration<UserRole>
    method UserRoleTypeConfiguration (line 10) | public UserRoleTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/ModelConfigurations/UserTypeConfiguration.cs
  class UserTypeConfiguration (line 7) | public class UserTypeConfiguration : EntityTypeConfiguration<User>
    method UserTypeConfiguration (line 9) | public UserTypeConfiguration()

FILE: OnlineStore.Repositories/EntityFramework/OnlineStoreDbContext.cs
  class OnlineStoreDbContext (line 7) | public sealed class OnlineStoreDbContext : DbContext
    method OnlineStoreDbContext (line 10) | public OnlineStoreDbContext()
    method OnModelCreating (line 65) | protected override void OnModelCreating(DbModelBuilder modelBuilder)

FILE: OnlineStore.Repositories/EntityFramework/OnlineStoreDbContextInitailizer.cs
  class OnlineStoreDbContextInitailizer (line 6) | public sealed class OnlineStoreDbContextInitailizer : DropCreateDatabase...
    method Seed (line 10) | protected override void Seed(OnlineStoreDbContext context)
    method Initialize (line 18) | public static void Initialize()

FILE: OnlineStore.Repositories/EntityFramework/OrderRepository.cs
  class OrderRepository (line 7) | public class OrderRepository : EntityFrameworkRepository<Order>, IOrderR...
    method OrderRepository (line 9) | public OrderRepository(IRepositoryContext context) : base(context)

FILE: OnlineStore.Repositories/EntityFramework/ProductCategorizationRepository.cs
  class ProductCategorizationRepository (line 10) | public class ProductCategorizationRepository : EntityFrameworkRepository...
    method ProductCategorizationRepository (line 12) | public ProductCategorizationRepository(IRepositoryContext context) : b...
    method GetProductsForCategory (line 16) | public IEnumerable<Product> GetProductsForCategory(Category category)
    method GetProductsForCategoryWithPagination (line 31) | public PagedResult<Product> GetProductsForCategoryWithPagination(Categ...
    method GetCategoryForProduct (line 50) | public Category GetCategoryForProduct(Product product)

FILE: OnlineStore.Repositories/EntityFramework/ProductRepository.cs
  class ProductRepository (line 12) | public class ProductRepository : EntityFrameworkRepository<Product>, IPr...
    method ProductRepository (line 16) | public ProductRepository(IRepositoryContext context)
    method GetNewProducts (line 23) | public IEnumerable<Product> GetNewProducts(int count = 0)

FILE: OnlineStore.Repositories/EntityFramework/RoleRepository.cs
  class RoleRepository (line 6) | public class RoleRepository : EntityFrameworkRepository<Role>, IRoleRepo...
    method RoleRepository (line 8) | public RoleRepository(IRepositoryContext context)

FILE: OnlineStore.Repositories/EntityFramework/ShoppingCartItemRepository.cs
  class ShoppingCartItemRepository (line 7) | public class ShoppingCartItemRepository : EntityFrameworkRepository<Shop...
    method ShoppingCartItemRepository (line 9) | public ShoppingCartItemRepository(IRepositoryContext context)
    method FindItem (line 15) | public ShoppingCartItem FindItem(ShoppingCart shoppingCart, Product pr...

FILE: OnlineStore.Repositories/EntityFramework/ShoppingCartRepository.cs
  class ShoppingCartRepository (line 6) | public class ShoppingCartRepository : EntityFrameworkRepository<Shopping...
    method ShoppingCartRepository (line 8) | public ShoppingCartRepository(IRepositoryContext context) : base(context)

FILE: OnlineStore.Repositories/EntityFramework/SortByExtension.cs
  class SortByExtension (line 12) | internal static class SortByExtension
    method SortBy (line 15) | internal static IOrderedQueryable<TAggregateRoot> SortBy<TAggregateRoo...
    method SortByDescending (line 21) | internal static IOrderedQueryable<TAggregateRoot> SortByDescending<TAg...
    method InvokeSortBy (line 29) | private static IOrderedQueryable<TAggregateRoot> InvokeSortBy<TAggrega...
    method GetSortingMethodName (line 73) | private static string GetSortingMethodName(SortOrder sortOrder)

FILE: OnlineStore.Repositories/EntityFramework/UserRepository.cs
  class UserRepository (line 9) | public class UserRepository : EntityFrameworkRepository<User>, IUserRepo...
    method UserRepository (line 11) | public UserRepository(IRepositoryContext context)
    method CheckPassword (line 16) | public bool CheckPassword(string userName, string password)

FILE: OnlineStore.Repositories/EntityFramework/UserRoleRepository.cs
  class UserRoleRepository (line 9) | public class UserRoleRepository :EntityFrameworkRepository<UserRole>, IU...
    method UserRoleRepository (line 11) | public UserRoleRepository(IRepositoryContext context)
    method GetRoleForUser (line 14) | public Role GetRoleForUser(User user)

FILE: OnlineStore.ServiceContract/IOrderService.cs
  type IOrderService (line 8) | [ServiceContract]
    method GetShoppingCartItemCount (line 12) | [OperationContract]
    method AddProductToCart (line 17) | [OperationContract]
    method GetShoppingCart (line 22) | [OperationContract]
    method UpdateShoppingCartItem (line 27) | [OperationContract]
    method DeleteShoppingCartItem (line 31) | [OperationContract]
    method Checkout (line 35) | [OperationContract]
    method GetOrder (line 39) | [OperationContract]
    method GetOrdersForUser (line 43) | [OperationContract]
    method GetAllOrders (line 47) | [OperationContract]
    method Confirm (line 52) | [OperationContract]
    method Dispatch (line 57) | [OperationContract]

FILE: OnlineStore.ServiceContract/IProductService.cs
  type IProductService (line 13) | [ServiceContract(Namespace="")]
    method CreateProducts (line 18) | [OperationContract]
    method CreateCategories (line 29) | [OperationContract]
    method UpdateProducts (line 34) | [OperationContract]
    method UpdateCategories (line 43) | [OperationContract]
    method DeleteProducts (line 48) | [OperationContract]
    method DeleteCategories (line 57) | [OperationContract]
    method CategorizeProduct (line 68) | [OperationContract]
    method UncategorizeProduct (line 78) | [OperationContract]
    method GetProducts (line 84) | [OperationContract]
    method GetProductsWithPagination (line 89) | [OperationContract]
    method GetProductsForCategory (line 95) | [OperationContract]
    method GetProductsForCategoryWithPagination (line 100) | [OperationContract]
    method GetNewProducts (line 106) | [OperationContract]
    method GetCategoryById (line 112) | [OperationContract]
    method GetCategories (line 118) | [OperationContract]
    method GetProductById (line 124) | [OperationContract]

FILE: OnlineStore.ServiceContract/IUserService.cs
  type IUserService (line 10) | [ServiceContract(Namespace = "")]
    method CreateUsers (line 15) | [OperationContract]
    method ValidateUser (line 19) | [OperationContract]
    method DisableUser (line 23) | [OperationContract]
    method EnableUser (line 27) | [OperationContract]
    method DeleteUsers (line 31) | [OperationContract]
    method UpdateUsers (line 35) | [OperationContract]
    method GetUserByKey (line 39) | [OperationContract]
    method GetUserByEmail (line 43) | [OperationContract]
    method GetUserByName (line 47) | [OperationContract]
    method GetUsers (line 51) | [OperationContract]
    method GetRoles (line 55) | [OperationContract]
    method GetRoleByKey (line 59) | [FaultContract(typeof(FaultData))]
    method CreateRoles (line 62) | [OperationContract]
    method UpdateRoles (line 66) | [OperationContract]
    method DeleteRoles (line 70) | [OperationContract]
    method AssignRole (line 74) | [OperationContract]
    method UnassignRole (line 79) | [OperationContract]
    method GetRoleByUserName (line 84) | [OperationContract]
    method GetOrdersForUser (line 89) | [OperationContract]

FILE: OnlineStore.ServiceContract/ModelDTOs/AddressDto.cs
  class AddressDto (line 3) | public class AddressDto

FILE: OnlineStore.ServiceContract/ModelDTOs/CategoryDto.cs
  class CategoryDto (line 5) | public class CategoryDto

FILE: OnlineStore.ServiceContract/ModelDTOs/FaultData.cs
  class FaultData (line 8) | [DataContract]
    method CreateFromException (line 25) | public static FaultData CreateFromException(Exception ex)
    method CreateFaultReason (line 35) | public static FaultReason CreateFaultReason(Exception ex)

FILE: OnlineStore.ServiceContract/ModelDTOs/OrderDto.cs
  class OrderDto (line 6) | public class OrderDto

FILE: OnlineStore.ServiceContract/ModelDTOs/OrderItemDto.cs
  class OrderItemDto (line 5) | public class OrderItemDto

FILE: OnlineStore.ServiceContract/ModelDTOs/OrderStatusDto.cs
  type OrderStatusDto (line 3) | public enum OrderStatusDto : int

FILE: OnlineStore.ServiceContract/ModelDTOs/Pagination.cs
  class Pagination (line 4) | public class Pagination
    method ToString (line 10) | public override string ToString()

FILE: OnlineStore.ServiceContract/ModelDTOs/ProductCategorizationDto.cs
  class ProductCategorizationDto (line 5) | public class ProductCategorizationDto

FILE: OnlineStore.ServiceContract/ModelDTOs/ProductDto.cs
  class ProductDto (line 3) | public class ProductDto

FILE: OnlineStore.ServiceContract/ModelDTOs/ProductDtoWithPagination.cs
  class ProductDtoWithPagination (line 5) | public class ProductDtoWithPagination

FILE: OnlineStore.ServiceContract/ModelDTOs/RoleDto.cs
  class RoleDto (line 3) | public class RoleDto

FILE: OnlineStore.ServiceContract/ModelDTOs/ShoppingCartDto.cs
  class ShoppingCartDto (line 5) | public class ShoppingCartDto

FILE: OnlineStore.ServiceContract/ModelDTOs/ShoppingCartItemDto.cs
  class ShoppingCartItemDto (line 3) | public class ShoppingCartItemDto

FILE: OnlineStore.ServiceContract/ModelDTOs/UserDto.cs
  class UserDto (line 5) | public class UserDto
    method ToString (line 21) | public override string ToString()

FILE: OnlineStore.Web/App_Code/HtmlExtension.cs
  type ImageSize (line 11) | public enum ImageSize
  class HtmlExtension (line 18) | public static class HtmlExtension
    method Image (line 21) | public static MvcHtmlString Image(this HtmlHelper helper, string rawFile)
    method ProductImage (line 32) | public static MvcHtmlString ProductImage(this HtmlHelper helper, strin...
    method ProductImage (line 64) | public static MvcHtmlString ProductImage(this HtmlHelper helper, strin...
    method ProductImage (line 69) | public static MvcHtmlString ProductImage(this HtmlHelper helper, strin...
    method ProductImage (line 74) | public static MvcHtmlString ProductImage(this HtmlHelper helper, strin...
    method ImageSubmitButton (line 81) | public static MvcHtmlString ImageSubmitButton(this HtmlHelper helper, ...
    method ImageActionLink (line 99) | public static MvcHtmlString ImageActionLink(this HtmlHelper helper, st...
    method ImageActionLink (line 125) | public static MvcHtmlString ImageActionLink(this HtmlHelper helper, st...
    method ImageActionLink (line 130) | public static MvcHtmlString ImageActionLink(this HtmlHelper helper, st...
    method ImageActionLink (line 135) | public static MvcHtmlString ImageActionLink(this HtmlHelper helper, st...
    method ImageActionLink (line 140) | public static MvcHtmlString ImageActionLink(this HtmlHelper helper, st...
    method ActionLinkWithPermission (line 147) | public static MvcHtmlString ActionLinkWithPermission(this HtmlHelper h...

FILE: OnlineStore.Web/App_Code/PermissionKeys.cs
  type PermissionKeys (line 5) | [Flags]

FILE: OnlineStore.Web/App_Code/UrlHelperExtension.cs
  class UrlHelperExtension (line 5) | public static class UrlHelperExtension
    method GetProductImagePath (line 7) | public static string GetProductImagePath(UrlHelper helper)
    method ProductImagePath (line 12) | public static MvcHtmlString ProductImagePath(this UrlHelper helper)

FILE: OnlineStore.Web/App_Start/AuthConfig.cs
  class AuthConfig (line 9) | public static class AuthConfig
    method RegisterAuth (line 11) | public static void RegisterAuth()

FILE: OnlineStore.Web/App_Start/BundleConfig.cs
  class BundleConfig (line 6) | public class BundleConfig
    method RegisterBundles (line 9) | public static void RegisterBundles(BundleCollection bundles)

FILE: OnlineStore.Web/App_Start/FilterConfig.cs
  class FilterConfig (line 6) | public class FilterConfig
    method RegisterGlobalFilters (line 8) | public static void RegisterGlobalFilters(GlobalFilterCollection filters)

FILE: OnlineStore.Web/App_Start/RouteConfig.cs
  class RouteConfig (line 10) | public class RouteConfig
    method RegisterRoutes (line 12) | public static void RegisterRoutes(RouteCollection routes)

FILE: OnlineStore.Web/App_Start/WebApiConfig.cs
  class WebApiConfig (line 8) | public static class WebApiConfig
    method Register (line 10) | public static void Register(HttpConfiguration config)

FILE: OnlineStore.Web/Controllers/AccountController.cs
  class AccountController (line 18) | [Authorize]
    method Login (line 42) | [AllowAnonymous]
    method Login (line 52) | [HttpPost]
    method LogOff (line 82) | [HttpPost]
    method Register (line 93) | [AllowAnonymous]
    method Register (line 102) | [HttpPost]
    method Manage (line 160) | [Authorize]
    method Manage (line 173) | [HttpPost]
    method ErrorCodeToString (line 186) | private static string ErrorCodeToString(MembershipCreateStatus createS...

FILE: OnlineStore.Web/Controllers/AdminController.cs
  class AdminController (line 16) | [HandleError]
    method SaveFile (line 22) | [NonAction]
    method Upload (line 42) | [HttpPost]
    method Administration (line 57) | [Authorize]
    method Categories (line 67) | [Authorize]
    method EditCategory (line 77) | public ActionResult EditCategory(string id)
    method EditCategory (line 86) | [HttpPost]
    method DeleteCategory (line 98) | [Authorize]
    method AddCategory (line 108) | [Authorize]
    method AddCategory (line 114) | [HttpPost]
    method Products (line 129) | [Authorize]
    method EditProduct (line 139) | [Authorize]
    method EditProduct (line 155) | [HttpPost]
    method AddProduct (line 170) | [Authorize]
    method AddProduct (line 182) | [HttpPost]
    method DeleteProduct (line 202) | [Authorize]
    method UserAccounts (line 215) | [Authorize]
    method AddUserAccount (line 227) | [Authorize]
    method AddUserAccount (line 241) | [HttpPost]
    method EditUserAccount (line 255) | [Authorize]
    method EditUserAccount (line 274) | [HttpPost]
    method DisableUserAccount (line 290) | [Authorize]
    method EnableUserAccount (line 300) | [Authorize]
    method DeleteUserAccount (line 310) | [Authorize]
    method Roles (line 322) | [Authorize]
    method EditRole (line 332) | [Authorize]
    method EditRole (line 342) | [HttpPost]
    method DeleteRole (line 352) | public ActionResult DeleteRole(string id)
    method AddRole (line 361) | public ActionResult AddRole()
    method AddRole (line 366) | [HttpPost]
    method Orders (line 378) | public ActionResult Orders()
    method Order (line 387) | public ActionResult Order(string id)
    method DispatchOrder (line 396) | public ActionResult DispatchOrder(string id)

FILE: OnlineStore.Web/Controllers/ControllerBase.cs
  class ControllerBase (line 7) | public class ControllerBase : Controller
    method RedirectToSuccess (line 24) | protected ActionResult RedirectToSuccess(string pageTitle, string acti...

FILE: OnlineStore.Web/Controllers/HomeController.cs
  class HomeController (line 13) | public class HomeController : ControllerBase
    method Index (line 34) | public ActionResult Index(string categoryId = null, int pageNumber = 1)
    method Category (line 39) | public ActionResult Category(string categoryId = null, int pageNumber ...
    method ProductDetail (line 46) | public ActionResult ProductDetail(string id)
    method AddToCart (line 55) | [Authorize]
    method ShoppingCart (line 68) | [Authorize]
    method UpdateShoppingCartItem (line 78) | [Authorize]
    method DeleteShoppingCartItem (line 88) | [Authorize]
    method Checkout (line 102) | [Authorize]
    method Orders (line 112) | [Authorize]
    method Order (line 122) | [Authorize]
    method Confirm (line 132) | [Authorize]
    method About (line 142) | public ActionResult About()
    method Contact (line 149) | public ActionResult Contact()
    method SuccessPage (line 156) | public ActionResult SuccessPage(string pageTitle, string pageMessage =...

FILE: OnlineStore.Web/Controllers/LayoutController.cs
  class LayoutController (line 16) | public class LayoutController : ControllerBase
    method _LoginPartial (line 20) | public ActionResult _LoginPartial()
    method CategoriesPartial (line 32) | public ActionResult CategoriesPartial()
    method NewProductsPartial (line 41) | public ActionResult NewProductsPartial()
    method ProductsPartial (line 76) | public ActionResult ProductsPartial(string categoryId = null, bool? fr...

FILE: OnlineStore.Web/Global.asax.cs
  class MvcApplication (line 15) | public class MvcApplication : System.Web.HttpApplication
    method Application_Start (line 17) | protected void Application_Start()

FILE: OnlineStore.Web/Membership/OnlineStoreMembershipProvider.cs
  class OnlineStoreMembershipProvider (line 11) | public class OnlineStoreMembershipProvider : MembershipProvider
    method ConvertFrom (line 25) | private OnlineStoreMembershipUser ConvertFrom(UserDto userDto)
    method GetConfigValue (line 51) | private string GetConfigValue(string configValue, string defaultValue)
    method CreateUser (line 59) | public OnlineStoreMembershipUser CreateUser(string username,
    method Initialize (line 127) | public override void Initialize(string name, NameValueCollection config)
    method ChangePassword (line 152) | public override bool ChangePassword(string username, string oldPasswor...
    method ChangePasswordQuestionAndAnswer (line 157) | public override bool ChangePasswordQuestionAndAnswer(string username, ...
    method CreateUser (line 162) | public override MembershipUser CreateUser(string username, string pass...
    method DeleteUser (line 167) | public override bool DeleteUser(string username, bool deleteAllRelated...
    method FindUsersByEmail (line 185) | public override MembershipUserCollection FindUsersByEmail(string email...
    method FindUsersByName (line 190) | public override MembershipUserCollection FindUsersByName(string userna...
    method GetAllUsers (line 195) | public override MembershipUserCollection GetAllUsers(int pageIndex, in...
    method GetNumberOfUsersOnline (line 200) | public override int GetNumberOfUsersOnline()
    method GetPassword (line 205) | public override string GetPassword(string username, string answer)
    method GetUser (line 210) | public override MembershipUser GetUser(string username, bool userIsOnl...
    method GetUser (line 221) | public override MembershipUser GetUser(object providerUserKey, bool us...
    method GetUserNameByEmail (line 232) | public override string GetUserNameByEmail(string email)
    method ResetPassword (line 282) | public override string ResetPassword(string username, string answer)
    method UnlockUser (line 287) | public override bool UnlockUser(string userName)
    method UpdateUser (line 292) | public override void UpdateUser(MembershipUser user)
    method ValidateUser (line 297) | public override bool ValidateUser(string username, string password)

FILE: OnlineStore.Web/Membership/OnlineStoreMembershipUser.cs
  class OnlineStoreMembershipUser (line 8) | public class OnlineStoreMembershipUser : MembershipUser
    method OnlineStoreMembershipUser (line 39) | public OnlineStoreMembershipUser(string providerName,
    method OnlineStoreMembershipUser (line 82) | public OnlineStoreMembershipUser(string providerName,

FILE: OnlineStore.Web/MvcSiteMap.cs
  class MvcSiteMap (line 10) | public class MvcSiteMap
    method MvcSiteMap (line 25) | private MvcSiteMap()
    method Navigator (line 29) | public MvcHtmlString Navigator()
    method FindNode (line 45) | private XElement FindNode(XElement node)
    method IsUrlEqual (line 53) | private bool IsUrlEqual(XElement c)
    method RecursiveNode (line 60) | private XElement RecursiveNode(XElement node)
    method GetNodeUrl (line 82) | private string GetNodeUrl(XElement c)
    method GetPath (line 90) | private Stack<XElement> GetPath(XElement c)
    method BuildPathString (line 102) | private string BuildPathString(Stack<XElement> m)

FILE: OnlineStore.Web/Scripts/jquery-1.7.1.js
  function jQuerySub (line 871) | function jQuerySub( selector, context ) {
  function doScrollCheck (line 937) | function doScrollCheck() {
  function createFlags (line 964) | function createFlags( flags ) {
  function resolveFunc (line 1296) | function resolveFunc( i ) {
  function progressFunc (line 1304) | function progressFunc( i ) {
  function dataAttr (line 1931) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 1962) | function isEmptyDataObject( obj ) {
  function handleQueueMarkDefer (line 1980) | function handleQueueMarkDefer( elem, type, src ) {
  function resolve (line 2133) | function resolve() {
  function returnFalse (line 3465) | function returnFalse() {
  function returnTrue (line 3468) | function returnTrue() {
  function dirNodeCheck (line 5168) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function dirCheck (line 5201) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function isDisconnected (line 5474) | function isDisconnected( node ) {
  function winnow (line 5591) | function winnow( elements, qualifier, keep ) {
  function createSafeFragment (line 5628) | function createSafeFragment( document ) {
  function root (line 5992) | function root( elem, cur ) {
  function cloneCopyEvent (line 5999) | function cloneCopyEvent( src, dest ) {
  function cloneFixAttributes (line 6027) | function cloneFixAttributes( src, dest ) {
  function getAll (line 6163) | function getAll( elem ) {
  function fixDefaultChecked (line 6176) | function fixDefaultChecked( elem ) {
  function findInputs (line 6182) | function findInputs( elem ) {
  function shimCloneNode (line 6193) | function shimCloneNode( elem ) {
  function evalScript (line 6425) | function evalScript( i, elem ) {
  function getWH (line 6767) | function getWH( elem, name, extra ) {
  function addToPrefiltersOrTransports (line 6895) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 6931) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 6973) | function ajaxExtend( target, src ) {
  function done (line 7315) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 7630) | function buildParams( prefix, obj, traditional, add ) {
  function ajaxHandleResponses (line 7680) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 7745) | function ajaxConvert( s, response ) {
  function createStandardXHR (line 8011) | function createStandardXHR() {
  function createActiveXHR (line 8017) | function createActiveXHR() {
  function doAnimation (line 8349) | function doAnimation() {
  function stopQueue (line 8492) | function stopQueue( elem, data, index ) {
  function createFxNow (line 8534) | function createFxNow() {
  function clearFxNow (line 8539) | function clearFxNow() {
  function genFx (line 8544) | function genFx( type, num ) {
  function t (line 8659) | function t( gotoEnd ) {
  function defaultDisplay (line 8851) | function defaultDisplay( nodeName ) {
  function getWindow (line 9160) | function getWindow( elem ) {

FILE: OnlineStore.Web/Scripts/jquery-ui-1.8.20.js
  function reduce (line 140) | function reduce( elem, size, border, margin ) {
  function focusable (line 175) | function focusable( element, isTabIndexNotNaN ) {
  function visible (line 196) | function visible( element ) {
  function getRGB (line 3984) | function getRGB(color) {
  function getColor (line 4015) | function getColor(elem, attr) {
  function getElementStyles (line 4101) | function getElementStyles() {
  function filterStyles (line 4132) | function filterStyles(styles) {
  function styleDifference (line 4156) | function styleDifference(oldStyle, newStyle) {
  function _normalizeArguments (line 4371) | function _normalizeArguments(effect, options, speed, callback) {
  function standardSpeed (line 4405) | function standardSpeed( speed ) {
  function Datepicker (line 7024) | function Datepicker() {
  function bindHover (line 8743) | function bindHover(dpDiv) {
  function extendRemove (line 8766) | function extendRemove(target, props) {
  function isArray (line 8775) | function isArray(a) {
  function filteredUi (line 9225) | function filteredUi(ui) {
  function filteredUi (line 9266) | function filteredUi(ui) {
  function getNextTabId (line 10726) | function getNextTabId() {
  function getNextListId (line 10730) | function getNextListId() {
  function resetStyle (line 11003) | function resetStyle( $el, fx ) {

FILE: OnlineStore.Web/Scripts/jquery.unobtrusive-ajax.js
  function getFunction (line 13) | function getFunction(code, argNames) {
  function isMethodProxySafe (line 25) | function isMethodProxySafe(method) {
  function asyncOnBeforeSend (line 29) | function asyncOnBeforeSend(xhr, method) {
  function asyncOnSuccess (line 35) | function asyncOnSuccess(element, data, contentType) {
  function asyncRequest (line 65) | function asyncRequest(element, options) {
  function validate (line 110) | function validate(form) {

FILE: OnlineStore.Web/Scripts/jquery.uploadify.js
  function f (line 13) | function f(){if(J){return;}try{var Z=j.getElementsByTagName("body")[0].a...
  function K (line 14) | function K(X){if(J){X();}else{U[U.length]=X;}}
  function s (line 14) | function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load"...
  function h (line 16) | function h(){if(T){V();}else{H();}}
  function V (line 16) | function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);
  function H (line 19) | function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[a...
  function z (line 23) | function z(aa){var X=null;
  function A (line 24) | function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312);
  function P (line 25) | function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X...
  function p (line 29) | function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");
  function g (line 31) | function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML...
  function u (line 33) | function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X;}if(aa){if...
  function e (line 37) | function e(Z,X,Y){var aa=C("param");
  function y (line 38) | function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.s...
  function b (line 39) | function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function...
  function c (line 40) | function c(Z){var X=null;try{X=j.getElementById(Z);}catch(Y){}return X;}
  function C (line 40) | function C(X){return j.createElement(X);}
  function i (line 40) | function i(Z,X,Y){Z.attachEvent(X,Y);
  function F (line 41) | function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=pars...
  function v (line 42) | function v(ac,Y,ad,ab){if(M.ie&&M.mac){return;}var aa=j.getElementsByTag...
  function w (line 45) | function w(Z,X){if(!m){return;}var Y=X?"visible":"hidden";if(J&&c(Z)){c(...
  function L (line 45) | function L(Y){var Z=/[\\\"<>\.;]/;

FILE: OnlineStore.Web/Scripts/jquery.validate-vsdoc.js
  function handle (line 77) | function handle() {
  function delegate (line 366) | function delegate(event) {
  function handler (line 1274) | function handler(e) {

FILE: OnlineStore.Web/Scripts/jquery.validate.js
  function handle (line 58) | function handle() {
  function delegate (line 311) | function delegate(event) {
  function handler (line 1169) | function handler(e) {

FILE: OnlineStore.Web/Scripts/jquery.validate.unobtrusive.js
  function setValidationValues (line 14) | function setValidationValues(options, ruleName, value) {
  function splitAndTrim (line 21) | function splitAndTrim(value) {
  function escapeAttributeValue (line 25) | function escapeAttributeValue(value) {
  function getModelPrefix (line 30) | function getModelPrefix(fieldName) {
  function appendModelPrefix (line 34) | function appendModelPrefix(value, prefix) {
  function onError (line 41) | function onError(error, inputElement) {  // 'this' is the form element
  function onErrors (line 57) | function onErrors(event, validator) {  // 'this' is the form element
  function onSuccess (line 71) | function onSuccess(error) {  // 'this' is the form element
  function onReset (line 85) | function onReset(event) {  // 'this' is the form element
  function validationInfo (line 99) | function validationInfo(form) {

FILE: OnlineStore.Web/Scripts/knockout-2.1.0.debug.js
  function isClickOnCheckableElement (line 73) | function isClickOnCheckableElement(element, eventType) {
  function getDisposeCallbacksCollection (line 535) | function getDisposeCallbacksCollection(node, createIfNotFound) {
  function destroyCallbacksCollection (line 543) | function destroyCallbacksCollection(node) {
  function cleanSingleNode (line 547) | function cleanSingleNode(node) {
  function cleanImmediateCommentTypeChildren (line 571) | function cleanImmediateCommentTypeChildren(nodeWithChildren) {
  function simpleHtmlParse (line 629) | function simpleHtmlParse(html) {
  function jQueryHtmlParse (line 663) | function jQueryHtmlParse(html) {
  function randomMax8HexChars (line 715) | function randomMax8HexChars() {
  function generateRandomId (line 718) | function generateRandomId() {
  function findMemoNodes (line 721) | function findMemoNodes(rootNode, appendToArray) {
  function applyExtenders (line 811) | function applyExtenders(requestedExtenders) {
  function observable (line 925) | function observable() {
  function disposeAllSubscriptionsToDependencies (line 1128) | function disposeAllSubscriptionsToDependencies() {
  function evaluatePossiblyAsync (line 1154) | function evaluatePossiblyAsync() {
  function evaluateImmediate (line 1163) | function evaluateImmediate() {
  function dependentObservable (line 1215) | function dependentObservable() {
  function set (line 1223) | function set() {
  function get (line 1232) | function get() {
  function mapJsObjectGraph (line 1291) | function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {
  function visitPropertiesOrArrayEntries (line 1325) | function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
  function objectLookup (line 1339) | function objectLookup() {
  function restoreTokens (line 1428) | function restoreTokens(string, tokens) {
  function isWriteableValue (line 1439) | function isWriteableValue(expression) {
  function ensureQuoted (line 1445) | function ensureQuoted(key) {
  function isStartComment (line 1631) | function isStartComment(node) {
  function isEndComment (line 1635) | function isEndComment(node) {
  function getVirtualChildren (line 1639) | function getVirtualChildren(startComment, allowUnbalanced) {
  function getMatchingEndComment (line 1660) | function getMatchingEndComment(startComment, allowUnbalanced) {
  function getUnbalancedChildTags (line 1670) | function getUnbalancedChildTags(node) {
  function createBindingsStringEvaluatorViaCache (line 1851) | function createBindingsStringEvaluatorViaCache(bindingsString, scopesCou...
  function createBindingsStringEvaluator (line 1857) | function createBindingsStringEvaluator(bindingsString, scopesCount) {
  function validateThatBindingIsAllowedForVirtualElements (line 1888) | function validateThatBindingIsAllowedForVirtualElements(bindingName) {
  function applyBindingsToDescendantsInternal (line 1894) | function applyBindingsToDescendantsInternal (viewModel, elementOrVirtual...
  function applyBindingsToNodeAndDescendantsInternal (line 1903) | function applyBindingsToNodeAndDescendantsInternal (viewModel, nodeVerif...
  function applyBindingsToNodeInternal (line 1930) | function applyBindingsToNodeInternal (node, bindings, viewModelOrBinding...
  function ensureDropdownSelectionIsConsistentWithModelValue (line 2169) | function ensureDropdownSelectionIsConsistentWithModelValue(element, mode...
  function validateDataBindValuesForRewriting (line 2706) | function validateDataBindValuesForRewriting(keyValueArray) {
  function constructMemoizedTagReplacement (line 2724) | function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRe...
  function invokeForEachNodeOrCommentInContinuousRange (line 2866) | function invokeForEachNodeOrCommentInContinuousRange(firstNode, lastNode...
  function activateBindingsOnContinuousNodeArray (line 2875) | function activateBindingsOnContinuousNodeArray(continuousNodeArray, bind...
  function getFirstNodeFromPossibleArray (line 2896) | function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
  function executeTemplate (line 2902) | function executeTemplate(targetNodeOrNodeArray, renderMode, template, bi...
  function disposeOldSubscriptionAndStoreNewOne (line 3014) | function disposeOldSubscriptionAndStoreNewOne(element, newSubscription) {
  function calculateEditDistanceMatrix (line 3092) | function calculateEditDistanceMatrix(oldArray, newArray, maxAllowedDista...
  function findEditScriptFromEditDistanceMatrix (line 3126) | function findEditScriptFromEditDistanceMatrix(editDistanceMatrix, oldArr...
  function fixUpVirtualElements (line 3184) | function fixUpVirtualElements(contiguousNodeArray) {
  function mapNodeAndRefreshWhenChanged (line 3206) | function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap...
  function ensureHasReferencedJQueryTemplates (line 3380) | function ensureHasReferencedJQueryTemplates() {
  function executeTemplate (line 3385) | function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {

FILE: OnlineStore.Web/Scripts/knockout-2.1.0.js
  function m (line 6) | function m(w){throw w;}
  function A (line 6) | function A(w){return function(){return w}}
  function E (line 6) | function E(w){function B(b,c,d){d&&c!==a.k.r(b)&&a.k.S(b,c);c!==a.k.r(b)...

FILE: OnlineStore.Web/Scripts/modernizr-2.5.3.js
  function isEventSupported (line 165) | function isEventSupported( eventName, element ) {
  function setCss (line 259) | function setCss( str ) {
  function setCssAll (line 266) | function setCssAll( str1, str2 ) {
  function is (line 273) | function is( obj, type ) {
  function contains (line 280) | function contains( str, substr ) {
  function testProps (line 289) | function testProps( props, prefixed ) {
  function testDOMProps (line 302) | function testDOMProps( props, obj, elem ) {
  function testPropsAll (line 329) | function testPropsAll( prop, prefixed, elem ) {
  function webforms (line 831) | function webforms() {
  function addStyleSheet (line 1037) | function addStyleSheet(ownerDocument, cssText) {
  function getElements (line 1050) | function getElements() {
  function shivMethods (line 1060) | function shivMethods(ownerDocument) {
  function shivDocument (line 1099) | function shivDocument(ownerDocument) {

FILE: OnlineStore.Web/Service References/OnlineStoreDto.Partial.cs
  class OrderDto (line 8) | public partial class OrderDto
    method ToString (line 73) | public override string ToString()
  class ProductDto (line 82) | public partial class ProductDto
  class CategoryDto (line 118) | public  partial class CategoryDto

FILE: OnlineStore.Web/Service References/OrderService/Reference.cs
  class FaultData (line 16) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 85) | protected void RaisePropertyChanged(string propertyName) {
  class ShoppingCartDto (line 93) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 178) | protected void RaisePropertyChanged(string propertyName) {
  class ShoppingCartItemDto (line 186) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 287) | protected void RaisePropertyChanged(string propertyName) {
  class ProductDto (line 295) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 428) | protected void RaisePropertyChanged(string propertyName) {
  class CategoryDto (line 436) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 505) | protected void RaisePropertyChanged(string propertyName) {
  class OrderDto (line 513) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 806) | protected void RaisePropertyChanged(string propertyName) {
  class OrderItemDto (line 814) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 915) | protected void RaisePropertyChanged(string propertyName) {
  type OrderStatusDto (line 923) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serializ...
  type IOrderService (line 943) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
    method GetShoppingCartItemCount (line 947) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetShoppingCartItemCountAsync (line 951) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method AddProductToCart (line 954) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method AddProductToCartAsync (line 958) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetShoppingCart (line 961) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetShoppingCartAsync (line 965) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method UpdateShoppingCartItem (line 968) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method UpdateShoppingCartItemAsync (line 972) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method DeleteShoppingCartItem (line 975) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method DeleteShoppingCartItemAsync (line 979) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method Checkout (line 982) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method CheckoutAsync (line 986) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetOrder (line 989) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetOrderAsync (line 993) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetOrdersForUser (line 996) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetOrdersForUserAsync (line 1000) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetAllOrders (line 1003) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method GetAllOrdersAsync (line 1007) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method Confirm (line 1010) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method ConfirmAsync (line 1014) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method Dispatch (line 1017) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
    method DispatchAsync (line 1021) | [System.ServiceModel.OperationContractAttribute(Action="http://tempuri...
  type IOrderServiceChannel (line 1025) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
  class OrderServiceClient (line 1029) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method OrderServiceClient (line 1033) | public OrderServiceClient() {
    method OrderServiceClient (line 1036) | public OrderServiceClient(string endpointConfigurationName) :
    method OrderServiceClient (line 1040) | public OrderServiceClient(string endpointConfigurationName, string rem...
    method OrderServiceClient (line 1044) | public OrderServiceClient(string endpointConfigurationName, System.Ser...
    method OrderServiceClient (line 1048) | public OrderServiceClient(System.ServiceModel.Channels.Binding binding...
    method GetShoppingCartItemCount (line 1052) | public int GetShoppingCartItemCount(System.Guid userId) {
    method GetShoppingCartItemCountAsync (line 1056) | public System.Threading.Tasks.Task<int> GetShoppingCartItemCountAsync(...
    method AddProductToCart (line 1060) | public void AddProductToCart(System.Guid customerId, System.Guid produ...
    method AddProductToCartAsync (line 1064) | public System.Threading.Tasks.Task AddProductToCartAsync(System.Guid c...
    method GetShoppingCart (line 1068) | public OnlineStore.Web.OrderService.ShoppingCartDto GetShoppingCart(Sy...
    method GetShoppingCartAsync (line 1072) | public System.Threading.Tasks.Task<OnlineStore.Web.OrderService.Shoppi...
    method UpdateShoppingCartItem (line 1076) | public void UpdateShoppingCartItem(System.Guid shoppingCartItemId, int...
    method UpdateShoppingCartItemAsync (line 1080) | public System.Threading.Tasks.Task UpdateShoppingCartItemAsync(System....
    method DeleteShoppingCartItem (line 1084) | public void DeleteShoppingCartItem(System.Guid shoppingCartItemId) {
    method DeleteShoppingCartItemAsync (line 1088) | public System.Threading.Tasks.Task DeleteShoppingCartItemAsync(System....
    method Checkout (line 1092) | public OnlineStore.Web.OrderService.OrderDto Checkout(System.Guid cust...
    method CheckoutAsync (line 1096) | public System.Threading.Tasks.Task<OnlineStore.Web.OrderService.OrderD...
    method GetOrder (line 1100) | public OnlineStore.Web.OrderService.OrderDto GetOrder(System.Guid orde...
    method GetOrderAsync (line 1104) | public System.Threading.Tasks.Task<OnlineStore.Web.OrderService.OrderD...
    method GetOrdersForUser (line 1108) | public OnlineStore.Web.OrderService.OrderDto[] GetOrdersForUser(System...
    method GetOrdersForUserAsync (line 1112) | public System.Threading.Tasks.Task<OnlineStore.Web.OrderService.OrderD...
    method GetAllOrders (line 1116) | public OnlineStore.Web.OrderService.OrderDto[] GetAllOrders() {
    method GetAllOrdersAsync (line 1120) | public System.Threading.Tasks.Task<OnlineStore.Web.OrderService.OrderD...
    method Confirm (line 1124) | public void Confirm(System.Guid orderId) {
    method ConfirmAsync (line 1128) | public System.Threading.Tasks.Task ConfirmAsync(System.Guid orderId) {
    method Dispatch (line 1132) | public void Dispatch(System.Guid orderId) {
    method DispatchAsync (line 1136) | public System.Threading.Tasks.Task DispatchAsync(System.Guid orderId) {

FILE: OnlineStore.Web/Service References/ProductService/Reference.cs
  class ProductDto (line 16) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 149) | protected void RaisePropertyChanged(string propertyName) {
  class CategoryDto (line 157) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 226) | protected void RaisePropertyChanged(string propertyName) {
  class FaultData (line 234) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 303) | protected void RaisePropertyChanged(string propertyName) {
  class ProductCategorizationDto (line 311) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 380) | protected void RaisePropertyChanged(string propertyName) {
  class Pagination (line 388) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 457) | protected void RaisePropertyChanged(string propertyName) {
  class ProductDtoWithPagination (line 465) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 518) | protected void RaisePropertyChanged(string propertyName) {
  type IProductService (line 526) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
    method CreateProducts (line 530) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method CreateProductsAsync (line 534) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method CreateCategories (line 537) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method CreateCategoriesAsync (line 541) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UpdateProducts (line 544) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UpdateProductsAsync (line 548) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UpdateCategories (line 551) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UpdateCategoriesAsync (line 555) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method DeleteProducts (line 558) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method DeleteProductsAsync (line 562) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method DeleteCategories (line 565) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method DeleteCategoriesAsync (line 569) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method CategorizeProduct (line 572) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method CategorizeProductAsync (line 576) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UncategorizeProduct (line 579) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method UncategorizeProductAsync (line 583) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProducts (line 586) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsAsync (line 590) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsWithPagination (line 593) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsWithPaginationAsync (line 597) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategory (line 600) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategoryAsync (line 604) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategoryWithPagination (line 607) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductsForCategoryWithPaginationAsync (line 611) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetNewProducts (line 614) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetNewProductsAsync (line 618) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategoryById (line 621) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategoryByIdAsync (line 625) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategories (line 628) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetCategoriesAsync (line 632) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductById (line 635) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
    method GetProductByIdAsync (line 639) | [System.ServiceModel.OperationContractAttribute(Action="urn:IProductSe...
  type IProductServiceChannel (line 643) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
  class ProductServiceClient (line 647) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method ProductServiceClient (line 651) | public ProductServiceClient() {
    method ProductServiceClient (line 654) | public ProductServiceClient(string endpointConfigurationName) :
    method ProductServiceClient (line 658) | public ProductServiceClient(string endpointConfigurationName, string r...
    method ProductServiceClient (line 662) | public ProductServiceClient(string endpointConfigurationName, System.S...
    method ProductServiceClient (line 666) | public ProductServiceClient(System.ServiceModel.Channels.Binding bindi...
    method CreateProducts (line 670) | public OnlineStore.Web.ProductService.ProductDto[] CreateProducts(Onli...
    method CreateProductsAsync (line 674) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method CreateCategories (line 678) | public OnlineStore.Web.ProductService.CategoryDto[] CreateCategories(O...
    method CreateCategoriesAsync (line 682) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Cate...
    method UpdateProducts (line 686) | public OnlineStore.Web.ProductService.ProductDto[] UpdateProducts(Onli...
    method UpdateProductsAsync (line 690) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method UpdateCategories (line 694) | public OnlineStore.Web.ProductService.CategoryDto[] UpdateCategories(O...
    method UpdateCategoriesAsync (line 698) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Cate...
    method DeleteProducts (line 702) | public void DeleteProducts(string[] produList) {
    method DeleteProductsAsync (line 706) | public System.Threading.Tasks.Task DeleteProductsAsync(string[] produL...
    method DeleteCategories (line 710) | public void DeleteCategories(string[] categoryList) {
    method DeleteCategoriesAsync (line 714) | public System.Threading.Tasks.Task DeleteCategoriesAsync(string[] cate...
    method CategorizeProduct (line 718) | public OnlineStore.Web.ProductService.ProductCategorizationDto Categor...
    method CategorizeProductAsync (line 722) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method UncategorizeProduct (line 726) | public void UncategorizeProduct(System.Guid productId) {
    method UncategorizeProductAsync (line 730) | public System.Threading.Tasks.Task UncategorizeProductAsync(System.Gui...
    method GetProducts (line 734) | public OnlineStore.Web.ProductService.ProductDto[] GetProducts() {
    method GetProductsAsync (line 738) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method GetProductsWithPagination (line 742) | public OnlineStore.Web.ProductService.ProductDtoWithPagination GetProd...
    method GetProductsWithPaginationAsync (line 746) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method GetProductsForCategory (line 750) | public OnlineStore.Web.ProductService.ProductDto[] GetProductsForCateg...
    method GetProductsForCategoryAsync (line 754) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method GetProductsForCategoryWithPagination (line 758) | public OnlineStore.Web.ProductService.ProductDtoWithPagination GetProd...
    method GetProductsForCategoryWithPaginationAsync (line 762) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method GetNewProducts (line 766) | public OnlineStore.Web.ProductService.ProductDto[] GetNewProducts(int ...
    method GetNewProductsAsync (line 770) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...
    method GetCategoryById (line 774) | public OnlineStore.Web.ProductService.CategoryDto GetCategoryById(Syst...
    method GetCategoryByIdAsync (line 778) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Cate...
    method GetCategories (line 782) | public OnlineStore.Web.ProductService.CategoryDto[] GetCategories() {
    method GetCategoriesAsync (line 786) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Cate...
    method GetProductById (line 790) | public OnlineStore.Web.ProductService.ProductDto GetProductById(System...
    method GetProductByIdAsync (line 794) | public System.Threading.Tasks.Task<OnlineStore.Web.ProductService.Prod...

FILE: OnlineStore.Web/Service References/UserService/Reference.cs
  class UserDto (line 16) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 229) | protected void RaisePropertyChanged(string propertyName) {
  class AddressDto (line 237) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 338) | protected void RaisePropertyChanged(string propertyName) {
  class RoleDto (line 346) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 415) | protected void RaisePropertyChanged(string propertyName) {
  class FaultData (line 423) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 492) | protected void RaisePropertyChanged(string propertyName) {
  class OrderDto (line 500) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 793) | protected void RaisePropertyChanged(string propertyName) {
  class OrderItemDto (line 801) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 902) | protected void RaisePropertyChanged(string propertyName) {
  type OrderStatusDto (line 910) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serializ...
  class ProductDto (line 930) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 1063) | protected void RaisePropertyChanged(string propertyName) {
  class CategoryDto (line 1071) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method RaisePropertyChanged (line 1140) | protected void RaisePropertyChanged(string propertyName) {
  type IUserService (line 1148) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
    method CreateUsers (line 1152) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method CreateUsersAsync (line 1156) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method ValidateUser (line 1159) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method ValidateUserAsync (line 1163) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DisableUser (line 1166) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DisableUserAsync (line 1170) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method EnableUser (line 1173) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method EnableUserAsync (line 1177) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DeleteUsers (line 1180) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DeleteUsersAsync (line 1184) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UpdateUsers (line 1187) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UpdateUsersAsync (line 1191) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByKey (line 1194) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByKeyAsync (line 1198) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByEmail (line 1201) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByEmailAsync (line 1205) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByName (line 1208) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUserByNameAsync (line 1212) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUsers (line 1215) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetUsersAsync (line 1219) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetRoles (line 1222) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetRolesAsync (line 1226) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method CreateRoles (line 1229) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method CreateRolesAsync (line 1233) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UpdateRoles (line 1236) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UpdateRolesAsync (line 1240) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DeleteRoles (line 1243) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method DeleteRolesAsync (line 1247) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method AssignRole (line 1250) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method AssignRoleAsync (line 1254) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UnassignRole (line 1257) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method UnassignRoleAsync (line 1261) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetRoleByUserName (line 1264) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetRoleByUserNameAsync (line 1268) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetOrdersForUser (line 1271) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
    method GetOrdersForUserAsync (line 1275) | [System.ServiceModel.OperationContractAttribute(Action="urn:IUserServi...
  type IUserServiceChannel (line 1279) | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "...
  class UserServiceClient (line 1283) | [System.Diagnostics.DebuggerStepThroughAttribute()]
    method UserServiceClient (line 1287) | public UserServiceClient() {
    method UserServiceClient (line 1290) | public UserServiceClient(string endpointConfigurationName) :
    method UserServiceClient (line 1294) | public UserServiceClient(string endpointConfigurationName, string remo...
    method UserServiceClient (line 1298) | public UserServiceClient(string endpointConfigurationName, System.Serv...
    method UserServiceClient (line 1302) | public UserServiceClient(System.ServiceModel.Channels.Binding binding,...
    method CreateUsers (line 1306) | public OnlineStore.Web.UserService.UserDto[] CreateUsers(OnlineStore.W...
    method CreateUsersAsync (line 1310) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method ValidateUser (line 1314) | public bool ValidateUser(string userName, string password) {
    method ValidateUserAsync (line 1318) | public System.Threading.Tasks.Task<bool> ValidateUserAsync(string user...
    method DisableUser (line 1322) | public bool DisableUser(OnlineStore.Web.UserService.UserDto userDto) {
    method DisableUserAsync (line 1326) | public System.Threading.Tasks.Task<bool> DisableUserAsync(OnlineStore....
    method EnableUser (line 1330) | public bool EnableUser(OnlineStore.Web.UserService.UserDto userDto) {
    method EnableUserAsync (line 1334) | public System.Threading.Tasks.Task<bool> EnableUserAsync(OnlineStore.W...
    method DeleteUsers (line 1338) | public void DeleteUsers(OnlineStore.Web.UserService.UserDto[] userDtos) {
    method DeleteUsersAsync (line 1342) | public System.Threading.Tasks.Task DeleteUsersAsync(OnlineStore.Web.Us...
    method UpdateUsers (line 1346) | public OnlineStore.Web.UserService.UserDto[] UpdateUsers(OnlineStore.W...
    method UpdateUsersAsync (line 1350) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method GetUserByKey (line 1354) | public OnlineStore.Web.UserService.UserDto GetUserByKey(System.Guid id) {
    method GetUserByKeyAsync (line 1358) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method GetUserByEmail (line 1362) | public OnlineStore.Web.UserService.UserDto GetUserByEmail(string email) {
    method GetUserByEmailAsync (line 1366) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method GetUserByName (line 1370) | public OnlineStore.Web.UserService.UserDto GetUserByName(string userNa...
    method GetUserByNameAsync (line 1374) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method GetUsers (line 1378) | public OnlineStore.Web.UserService.UserDto[] GetUsers() {
    method GetUsersAsync (line 1382) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.UserDto...
    method GetRoles (line 1386) | public OnlineStore.Web.UserService.RoleDto[] GetRoles() {
    method GetRolesAsync (line 1390) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.RoleDto...
    method CreateRoles (line 1394) | public OnlineStore.Web.UserService.RoleDto[] CreateRoles(OnlineStore.W...
    method CreateRolesAsync (line 1398) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.RoleDto...
    method UpdateRoles (line 1402) | public OnlineStore.Web.UserService.RoleDto[] UpdateRoles(OnlineStore.W...
    method UpdateRolesAsync (line 1406) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.RoleDto...
    method DeleteRoles (line 1410) | public void DeleteRoles(string[] roleList) {
    method DeleteRolesAsync (line 1414) | public System.Threading.Tasks.Task DeleteRolesAsync(string[] roleList) {
    method AssignRole (line 1418) | public void AssignRole(System.Guid userId, System.Guid roleId) {
    method AssignRoleAsync (line 1422) | public System.Threading.Tasks.Task AssignRoleAsync(System.Guid userId,...
    method UnassignRole (line 1426) | public void UnassignRole(System.Guid userId) {
    method UnassignRoleAsync (line 1430) | public System.Threading.Tasks.Task UnassignRoleAsync(System.Guid userI...
    method GetRoleByUserName (line 1434) | public OnlineStore.Web.UserService.RoleDto GetRoleByUserName(string us...
    method GetRoleByUserNameAsync (line 1438) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.RoleDto...
    method GetOrdersForUser (line 1442) | public OnlineStore.Web.UserService.OrderDto[] GetOrdersForUser(string ...
    method GetOrdersForUserAsync (line 1446) | public System.Threading.Tasks.Task<OnlineStore.Web.UserService.OrderDt...

FILE: OnlineStore.Web/ViewModels/LoginViewModel.cs
  class LoginViewModel (line 6) | public class LoginViewModel

FILE: OnlineStore.Web/ViewModels/UserAccountModel.cs
  class UserAccountModel (line 9) | public class UserAccountModel
    method ToString (line 120) | public override string ToString()
    method CreateFromDto (line 125) | public static UserAccountModel CreateFromDto(UserDto d)
    method ConvertToDto (line 152) | public UserDto ConvertToDto()

FILE: packages/Microsoft.jQuery.Unobtrusive.Ajax.2.0.20710.0/Content/Scripts/jquery.unobtrusive-ajax.js
  function getFunction (line 13) | function getFunction(code, argNames) {
  function isMethodProxySafe (line 25) | function isMethodProxySafe(method) {
  function asyncOnBeforeSend (line 29) | function asyncOnBeforeSend(xhr, method) {
  function asyncOnSuccess (line 35) | function asyncOnSuccess(element, data, contentType) {
  function asyncRequest (line 65) | function asyncRequest(element, options) {
  function validate (line 110) | function validate(form) {

FILE: packages/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/Content/Scripts/jquery.validate.unobtrusive.js
  function setValidationValues (line 14) | function setValidationValues(options, ruleName, value) {
  function splitAndTrim (line 21) | function splitAndTrim(value) {
  function escapeAttributeValue (line 25) | function escapeAttributeValue(value) {
  function getModelPrefix (line 30) | function getModelPrefix(fieldName) {
  function appendModelPrefix (line 34) | function appendModelPrefix(value, prefix) {
  function onError (line 41) | function onError(error, inputElement) {  // 'this' is the form element
  function onErrors (line 57) | function onErrors(event, validator) {  // 'this' is the form element
  function onSuccess (line 71) | function onSuccess(error) {  // 'this' is the form element
  function onReset (line 85) | function onReset(event) {  // 'this' is the form element
  function validationInfo (line 99) | function validationInfo(form) {

FILE: packages/Modernizr.2.5.3/Content/Scripts/modernizr-2.5.3.js
  function isEventSupported (line 165) | function isEventSupported( eventName, element ) {
  function setCss (line 259) | function setCss( str ) {
  function setCssAll (line 266) | function setCssAll( str1, str2 ) {
  function is (line 273) | function is( obj, type ) {
  function contains (line 280) | function contains( str, substr ) {
  function testProps (line 289) | function testProps( props, prefixed ) {
  function testDOMProps (line 302) | function testDOMProps( props, obj, elem ) {
  function testPropsAll (line 329) | function testPropsAll( prop, prefixed, elem ) {
  function webforms (line 831) | function webforms() {
  function addStyleSheet (line 1037) | function addStyleSheet(ownerDocument, cssText) {
  function getElements (line 1050) | function getElements() {
  function shivMethods (line 1060) | function shivMethods(ownerDocument) {
  function shivDocument (line 1099) | function shivDocument(ownerDocument) {

FILE: packages/jQuery.1.7.1.1/Content/Scripts/jquery-1.7.1-vsdoc.js
  function done (line 599) | function done( status, nativeStatusText, responses, headers ) {
  function jQuerySub (line 2873) | function jQuerySub( selector, context ) {
  function resolveFunc (line 3064) | function resolveFunc( i ) {
  function progressFunc (line 3072) | function progressFunc( i ) {
  function doAnimation (line 3391) | function doAnimation() {
  function resolve (line 5964) | function resolve() {
  function stopQueue (line 6674) | function stopQueue( elem, data, index ) {

FILE: packages/jQuery.1.7.1.1/Content/Scripts/jquery-1.7.1.js
  function jQuerySub (line 871) | function jQuerySub( selector, context ) {
  function doScrollCheck (line 937) | function doScrollCheck() {
  function createFlags (line 964) | function createFlags( flags ) {
  function resolveFunc (line 1296) | function resolveFunc( i ) {
  function progressFunc (line 1304) | function progressFunc( i ) {
  function dataAttr (line 1931) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 1962) | function isEmptyDataObject( obj ) {
  function handleQueueMarkDefer (line 1980) | function handleQueueMarkDefer( elem, type, src ) {
  function resolve (line 2133) | function resolve() {
  function returnFalse (line 3465) | function returnFalse() {
  function returnTrue (line 3468) | function returnTrue() {
  function dirNodeCheck (line 5168) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function dirCheck (line 5201) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function isDisconnected (line 5474) | function isDisconnected( node ) {
  function winnow (line 5591) | function winnow( elements, qualifier, keep ) {
  function createSafeFragment (line 5628) | function createSafeFragment( document ) {
  function root (line 5992) | function root( elem, cur ) {
  function cloneCopyEvent (line 5999) | function cloneCopyEvent( src, dest ) {
  function cloneFixAttributes (line 6027) | function cloneFixAttributes( src, dest ) {
  function getAll (line 6163) | function getAll( elem ) {
  function fixDefaultChecked (line 6176) | function fixDefaultChecked( elem ) {
  function findInputs (line 6182) | function findInputs( elem ) {
  function shimCloneNode (line 6193) | function shimCloneNode( elem ) {
  function evalScript (line 6425) | function evalScript( i, elem ) {
  function getWH (line 6767) | function getWH( elem, name, extra ) {
  function addToPrefiltersOrTransports (line 6895) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 6931) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 6973) | function ajaxExtend( target, src ) {
  function done (line 7315) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 7630) | function buildParams( prefix, obj, traditional, add ) {
  function ajaxHandleResponses (line 7680) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 7745) | function ajaxConvert( s, response ) {
  function createStandardXHR (line 8011) | function createStandardXHR() {
  function createActiveXHR (line 8017) | function createActiveXHR() {
  function doAnimation (line 8349) | function doAnimation() {
  function stopQueue (line 8492) | function stopQueue( elem, data, index ) {
  function createFxNow (line 8534) | function createFxNow() {
  function clearFxNow (line 8539) | function clearFxNow() {
  function genFx (line 8544) | function genFx( type, num ) {
  function t (line 8659) | function t( gotoEnd ) {
  function defaultDisplay (line 8851) | function defaultDisplay( nodeName ) {
  function getWindow (line 9160) | function getWindow( elem ) {

FILE: packages/jQuery.UI.Combined.1.8.20.1/Content/Scripts/jquery-ui-1.8.20.js
  function reduce (line 140) | function reduce( elem, size, border, margin ) {
  function focusable (line 175) | function focusable( element, isTabIndexNotNaN ) {
  function visible (line 196) | function visible( element ) {
  function getRGB (line 3984) | function getRGB(color) {
  function getColor (line 4015) | function getColor(elem, attr) {
  function getElementStyles (line 4101) | function getElementStyles() {
  function filterStyles (line 4132) | function filterStyles(styles) {
  function styleDifference (line 4156) | function styleDifference(oldStyle, newStyle) {
  function _normalizeArguments (line 4371) | function _normalizeArguments(effect, options, speed, callback) {
  function standardSpeed (line 4405) | function standardSpeed( speed ) {
  function Datepicker (line 7024) | function Datepicker() {
  function bindHover (line 8743) | function bindHover(dpDiv) {
  function extendRemove (line 8766) | function extendRemove(target, props) {
  function isArray (line 8775) | function isArray(a) {
  function filteredUi (line 9225) | function filteredUi(ui) {
  function filteredUi (line 9266) | function filteredUi(ui) {
  function getNextTabId (line 10726) | function getNextTabId() {
  function getNextListId (line 10730) | function getNextListId() {
  function resetStyle (line 11003) | function resetStyle( $el, fx ) {

FILE: packages/jQuery.Validation.1.9.0.1/Content/Scripts/jquery.validate-vsdoc.js
  function handle (line 77) | function handle() {
  function delegate (line 366) | function delegate(event) {
  function handler (line 1274) | function handler(e) {

FILE: packages/jQuery.Validation.1.9.0.1/Content/Scripts/jquery.validate.js
  function handle (line 58) | function handle() {
  function delegate (line 311) | function delegate(event) {
  function handler (line 1169) | function handler(e) {

FILE: packages/knockoutjs.2.1.0/Content/Scripts/knockout-2.1.0.debug.js
  function isClickOnCheckableElement (line 73) | function isClickOnCheckableElement(element, eventType) {
  function getDisposeCallbacksCollection (line 535) | function getDisposeCallbacksCollection(node, createIfNotFound) {
  function destroyCallbacksCollection (line 543) | function destroyCallbacksCollection(node) {
  function cleanSingleNode (line 547) | function cleanSingleNode(node) {
  function cleanImmediateCommentTypeChildren (line 571) | function cleanImmediateCommentTypeChildren(nodeWithChildren) {
  function simpleHtmlParse (line 629) | function simpleHtmlParse(html) {
  function jQueryHtmlParse (line 663) | function jQueryHtmlParse(html) {
  function randomMax8HexChars (line 715) | function randomMax8HexChars() {
  function generateRandomId (line 718) | function generateRandomId() {
  function findMemoNodes (line 721) | function findMemoNodes(rootNode, appendToArray) {
  function applyExtenders (line 811) | function applyExtenders(requestedExtenders) {
  function observable (line 925) | function observable() {
  function disposeAllSubscriptionsToDependencies (line 1128) | function disposeAllSubscriptionsToDependencies() {
  function evaluatePossiblyAsync (line 1154) | function evaluatePossiblyAsync() {
  function evaluateImmediate (line 1163) | function evaluateImmediate() {
  function dependentObservable (line 1215) | function dependentObservable() {
  function set (line 1223) | function set() {
  function get (line 1232) | function get() {
  function mapJsObjectGraph (line 1291) | function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {
  function visitPropertiesOrArrayEntries (line 1325) | function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
  function objectLookup (line 1339) | function objectLookup() {
  function restoreTokens (line 1428) | function restoreTokens(string, tokens) {
  function isWriteableValue (line 1439) | function isWriteableValue(expression) {
  function ensureQuoted (line 1445) | function ensureQuoted(key) {
  function isStartComment (line 1631) | function isStartComment(node) {
  function isEndComment (line 1635) | function isEndComment(node) {
  function getVirtualChildren (line 1639) | function getVirtualChildren(startComment, allowUnbalanced) {
  function getMatchingEndComment (line 1660) | function getMatchingEndComment(startComment, allowUnbalanced) {
  function getUnbalancedChildTags (line 1670) | function getUnbalancedChildTags(node) {
  function createBindingsStringEvaluatorViaCache (line 1851) | function createBindingsStringEvaluatorViaCache(bindingsString, scopesCou...
  function createBindingsStringEvaluator (line 1857) | function createBindingsStringEvaluator(bindingsString, scopesCount) {
  function validateThatBindingIsAllowedForVirtualElements (line 1888) | function validateThatBindingIsAllowedForVirtualElements(bindingName) {
  function applyBindingsToDescendantsInternal (line 1894) | function applyBindingsToDescendantsInternal (viewModel, elementOrVirtual...
  function applyBindingsToNodeAndDescendantsInternal (line 1903) | function applyBindingsToNodeAndDescendantsInternal (viewModel, nodeVerif...
  function applyBindingsToNodeInternal (line 1930) | function applyBindingsToNodeInternal (node, bindings, viewModelOrBinding...
  function ensureDropdownSelectionIsConsistentWithModelValue (line 2169) | function ensureDropdownSelectionIsConsistentWithModelValue(element, mode...
  function validateDataBindValuesForRewriting (line 2706) | function validateDataBindValuesForRewriting(keyValueArray) {
  function constructMemoizedTagReplacement (line 2724) | function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRe...
  function invokeForEachNodeOrCommentInContinuousRange (line 2866) | function invokeForEachNodeOrCommentInContinuousRange(firstNode, lastNode...
  function activateBindingsOnContinuousNodeArray (line 2875) | function activateBindingsOnContinuousNodeArray(continuousNodeArray, bind...
  function getFirstNodeFromPossibleArray (line 2896) | function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
  function executeTemplate (line 2902) | function executeTemplate(targetNodeOrNodeArray, renderMode, template, bi...
  function disposeOldSubscriptionAndStoreNewOne (line 3014) | function disposeOldSubscriptionAndStoreNewOne(element, newSubscription) {
  function calculateEditDistanceMatrix (line 3092) | function calculateEditDistanceMatrix(oldArray, newArray, maxAllowedDista...
  function findEditScriptFromEditDistanceMatrix (line 3126) | function findEditScriptFromEditDistanceMatrix(editDistanceMatrix, oldArr...
  function fixUpVirtualElements (line 3184) | function fixUpVirtualElements(contiguousNodeArray) {
  function mapNodeAndRefreshWhenChanged (line 3206) | function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap...
  function ensureHasReferencedJQueryTemplates (line 3380) | function ensureHasReferencedJQueryTemplates() {
  function executeTemplate (line 3385) | function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {

FILE: packages/knockoutjs.2.1.0/Content/Scripts/knockout-2.1.0.js
  function m (line 6) | function m(w){throw w;}
  function A (line 6) | function A(w){return function(){return w}}
  function E (line 6) | function E(w){function B(b,c,d){d&&c!==a.k.r(b)&&a.k.S(b,c);c!==a.k.r(b)...
Copy disabled (too large) Download .json
Condensed preview — 547 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (42,039K chars).
[
  {
    "path": ".gitattributes",
    "chars": 483,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln"
  },
  {
    "path": ".gitignore",
    "chars": 2643,
    "preview": "#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nloc"
  },
  {
    "path": ".nuget/NuGet.Config",
    "chars": 162,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <solution>\n    <add key=\"disableSourceControlIntegration\" valu"
  },
  {
    "path": ".nuget/NuGet.targets",
    "chars": 7484,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild"
  },
  {
    "path": "OnlineStore.Application/AddressResolver.cs",
    "chars": 552,
    "preview": "using AutoMapper;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.ServiceContracts.ModelDTOs;\n\nnamespace OnlineStore."
  },
  {
    "path": "OnlineStore.Application/ApplicationService.cs",
    "chars": 9238,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing AutoMapper;\nusing OnlineStore.Domain;\nusing On"
  },
  {
    "path": "OnlineStore.Application/Global.asax",
    "chars": 104,
    "preview": "<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"OnlineStore.Application.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "OnlineStore.Application/Global.asax.cs",
    "chars": 976,
    "preview": "using System;\nusing System.Web;\nusing OnlineStore.Repositories.EntityFramework;\n\nnamespace OnlineStore.Application\n{\n  "
  },
  {
    "path": "OnlineStore.Application/InversedAddressResolver.cs",
    "chars": 563,
    "preview": "using AutoMapper;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.ServiceContracts.ModelDTOs;\n\nnamespace OnlineStore."
  },
  {
    "path": "OnlineStore.Application/Logs/onlinestore.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "OnlineStore.Application/OnlineStore.Application.csproj",
    "chars": 12557,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "OnlineStore.Application/OrderService.svc",
    "chars": 127,
    "preview": "<%@ ServiceHost Language=\"C#\" Debug=\"true\" Service=\"OnlineStore.Application.OrderService\" CodeBehind=\"OrderService.svc."
  },
  {
    "path": "OnlineStore.Application/OrderService.svc.cs",
    "chars": 4746,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Ser"
  },
  {
    "path": "OnlineStore.Application/ProductService.svc",
    "chars": 130,
    "preview": "<%@ ServiceHost Language=\"C#\" Debug=\"true\" Service=\"OnlineStore.Application.ProductService\" CodeBehind=\"ProductService."
  },
  {
    "path": "OnlineStore.Application/ProductService.svc.cs",
    "chars": 6797,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ServiceModel;\nusing OnlineStore.Infrastructure;\nusing Onli"
  },
  {
    "path": "OnlineStore.Application/Properties/AssemblyInfo.cs",
    "chars": 1437,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "OnlineStore.Application/ServiceImplementations/OrderServiceImp.cs",
    "chars": 8022,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing AutoMapper;\nusing OnlineStore.Domain;\nusing On"
  },
  {
    "path": "OnlineStore.Application/ServiceImplementations/ProductServiceImp.cs",
    "chars": 9518,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing AutoMapper;\nusing OnlineStore.Domain.Model;\nus"
  },
  {
    "path": "OnlineStore.Application/ServiceImplementations/UserServiceImp.cs",
    "chars": 13019,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Remoting.Contexts;\nusing AutoMa"
  },
  {
    "path": "OnlineStore.Application/UserService.svc",
    "chars": 125,
    "preview": "<%@ ServiceHost Language=\"C#\" Debug=\"true\" Service=\"OnlineStore.Application.UserService\" CodeBehind=\"UserService.svc.cs"
  },
  {
    "path": "OnlineStore.Application/UserService.svc.cs",
    "chars": 7575,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Ser"
  },
  {
    "path": "OnlineStore.Application/Web.Debug.config",
    "chars": 1270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.mic"
  },
  {
    "path": "OnlineStore.Application/Web.Release.config",
    "chars": 1330,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.mic"
  },
  {
    "path": "OnlineStore.Application/Web.config",
    "chars": 12770,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"entityFramework\" type=\"Sys"
  },
  {
    "path": "OnlineStore.Application/packages.config",
    "chars": 607,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"AutoMapper\" version=\"3.3.1\" targetFramework=\"net45\" />"
  },
  {
    "path": "OnlineStore.Domain/DomainException.cs",
    "chars": 680,
    "preview": "using System;\nusing System.Runtime.Serialization;\n\nnamespace OnlineStore.Domain\n{\n    public class DomainException : Ex"
  },
  {
    "path": "OnlineStore.Domain/Events/DomainEvent.cs",
    "chars": 3271,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing System."
  },
  {
    "path": "OnlineStore.Domain/Events/EventHandlers/OrderConfirmedEventHandler.cs",
    "chars": 908,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Events.Bus;\n\nnamespace OnlineStore.Domain.Events.EventHandlers\n{\n    "
  },
  {
    "path": "OnlineStore.Domain/Events/EventHandlers/OrderDispatchedEventHandler.cs",
    "chars": 855,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\nusing OnlineStore.Events.Bus;\n\nnamespace OnlineS"
  },
  {
    "path": "OnlineStore.Domain/Events/IDomainEvent.cs",
    "chars": 180,
    "preview": "using OnlineStore.Events;\n\nnamespace OnlineStore.Domain.Events\n{\n    public interface IDomainEvent : IEvent\n    {\n     "
  },
  {
    "path": "OnlineStore.Domain/Events/IDomainEventHandler.cs",
    "chars": 278,
    "preview": "using OnlineStore.Events;\n\nnamespace OnlineStore.Domain.Events\n{\n    /// <summary>\n    /// 领域事件处理器\n    /// </summary>\n "
  },
  {
    "path": "OnlineStore.Domain/Events/OrderConfirmedEvent.cs",
    "chars": 561,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Events\n{\n    [Serializable]\n    public class OrderConfirmedEvent : DomainEv"
  },
  {
    "path": "OnlineStore.Domain/Events/OrderDispatchedEvent.cs",
    "chars": 564,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Events\n{\n    [Serializable]\n    public class OrderDispatchedEvent : DomainE"
  },
  {
    "path": "OnlineStore.Domain/IAggregateRoot.cs",
    "chars": 242,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "OnlineStore.Domain/IEntity.cs",
    "chars": 256,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "OnlineStore.Domain/Model/Address.cs",
    "chars": 1833,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    // 值对象 \n    public class Address\n    {\n        #region Properties\n        // "
  },
  {
    "path": "OnlineStore.Domain/Model/AggregateRoot.cs",
    "chars": 709,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Model\n{\n    public abstract class AggregateRoot : IAggregateRoot\n    {\n    "
  },
  {
    "path": "OnlineStore.Domain/Model/Category.cs",
    "chars": 289,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    // 类别类\n    public class Category : AggregateRoot\n    {\n        public string "
  },
  {
    "path": "OnlineStore.Domain/Model/Order.cs",
    "chars": 2301,
    "preview": "\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing OnlineStore.Domain.Events;\n\nnamespace OnlineS"
  },
  {
    "path": "OnlineStore.Domain/Model/OrderItem.cs",
    "chars": 1445,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Model\n{\n    public class OrderItem : IEntity\n    {\n        #region IEnity M"
  },
  {
    "path": "OnlineStore.Domain/Model/OrderStatus.cs",
    "chars": 214,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    public enum OrderStatus\n    {\n        Created = 0, // 订单已被创建\n        Paid, //"
  },
  {
    "path": "OnlineStore.Domain/Model/Product.cs",
    "chars": 417,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    // 商品类\n    public class Product : AggregateRoot\n    {\n        public string N"
  },
  {
    "path": "OnlineStore.Domain/Model/ProductCategorization.cs",
    "chars": 828,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Model\n{\n    public class ProductCategorization : AggregateRoot\n    {\n      "
  },
  {
    "path": "OnlineStore.Domain/Model/Role.cs",
    "chars": 181,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    public class Role : AggregateRoot\n    {\n        public string Name { get; set"
  },
  {
    "path": "OnlineStore.Domain/Model/ShoppingCart.cs",
    "chars": 138,
    "preview": "\nnamespace OnlineStore.Domain.Model\n{\n    public class ShoppingCart : AggregateRoot\n    {\n        public User User { ge"
  },
  {
    "path": "OnlineStore.Domain/Model/ShoppingCartItem.cs",
    "chars": 1019,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "OnlineStore.Domain/Model/User.cs",
    "chars": 1599,
    "preview": "\nusing System;\nusing System.Collections.Generic;\n\nnamespace OnlineStore.Domain.Model\n{\n    // 用户聚合根\n    public class Us"
  },
  {
    "path": "OnlineStore.Domain/Model/UserRole.cs",
    "chars": 355,
    "preview": "using System;\n\nnamespace OnlineStore.Domain.Model\n{\n    public class UserRole : AggregateRoot\n    {\n        public Guid"
  },
  {
    "path": "OnlineStore.Domain/OnlineStore.Domain.csproj",
    "chars": 5219,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "OnlineStore.Domain/Properties/AssemblyInfo.cs",
    "chars": 1427,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "OnlineStore.Domain/Repositories/ICategoryRepository.cs",
    "chars": 224,
    "preview": "using System.Collections;\nusing System.Collections.Generic;\nusing OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Doma"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IOrderRepository.cs",
    "chars": 164,
    "preview": "using OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Repositories\n{\n    // 订单仓储接口\n    public interface IOrderR"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IProductCategorizationRepository.cs",
    "chars": 966,
    "preview": "using System.Collections.Generic;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Infrastructure;\n\nnamespace OnlineSt"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IProductRepository.cs",
    "chars": 263,
    "preview": "using OnlineStore.Domain.Model;\nusing System;\nusing System.Collections.Generic;\n\nnamespace OnlineStore.Domain.Repositor"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IRepository.cs",
    "chars": 3456,
    "preview": "using OnlineStore.Domain.Specifications;\nusing OnlineStore.Infrastructure;\nusing System;\nusing System.Collections.Gener"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IRepositoryContext.cs",
    "chars": 767,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IRoleRepository.cs",
    "chars": 158,
    "preview": "using OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Repositories\n{\n    public interface IRoleRepository : IRe"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IShoppingCartItemRepository.cs",
    "chars": 285,
    "preview": "using System.Collections.Generic;\nusing OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Repositories\n{\n    publ"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IShoppingCartRepository.cs",
    "chars": 173,
    "preview": "using OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Repositories\n{\n    public interface IShoppingCartReposito"
  },
  {
    "path": "OnlineStore.Domain/Repositories/IUserRepository.cs",
    "chars": 251,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Specifications;\n\nnamespace OnlineStore.Domain.Repositories\n{\n "
  },
  {
    "path": "OnlineStore.Domain/Repositories/IUserRoleRepository.cs",
    "chars": 344,
    "preview": "using OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Repositories\n{\n    public interface IUserRoleRepository :"
  },
  {
    "path": "OnlineStore.Domain/Repositories/SortOrder.cs",
    "chars": 156,
    "preview": "namespace OnlineStore.Domain.Repositories\n{\n    public enum SortOrder\n    {\n        UnSpecified = -1,\n        Ascending"
  },
  {
    "path": "OnlineStore.Domain/Services/DomainService.cs",
    "chars": 6250,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing OnlineStore.Dom"
  },
  {
    "path": "OnlineStore.Domain/Services/IDomainService.cs",
    "chars": 1268,
    "preview": "using OnlineStore.Domain.Model;\n\nnamespace OnlineStore.Domain.Services\n{\n    // 领域服务接口\n    public interface IDomainServ"
  },
  {
    "path": "OnlineStore.Domain/Specifications/AnySpecification.cs",
    "chars": 288,
    "preview": "using System;\nusing System.Linq.Expressions;\n\nnamespace OnlineStore.Domain.Specifications\n{\n    public sealed class Any"
  },
  {
    "path": "OnlineStore.Domain/Specifications/ExpressionSpecification.cs",
    "chars": 503,
    "preview": "using System;\nusing System.Linq.Expressions;\n\nnamespace OnlineStore.Domain.Specifications\n{\n    public sealed class Exp"
  },
  {
    "path": "OnlineStore.Domain/Specifications/ISpecification.cs",
    "chars": 343,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\nus"
  },
  {
    "path": "OnlineStore.Domain/Specifications/ParameterReplacer.cs",
    "chars": 610,
    "preview": "using System.Linq.Expressions;\n\nnamespace OnlineStore.Domain.Specifications\n{\n    public class ParameterReplacer : Expr"
  },
  {
    "path": "OnlineStore.Domain/Specifications/SpecExprExtensions.cs",
    "chars": 1654,
    "preview": "using System;\nusing System.Linq.Expressions;\n\nnamespace OnlineStore.Domain.Specifications\n{\n    public static class Spe"
  },
  {
    "path": "OnlineStore.Domain/Specifications/Specification.cs",
    "chars": 727,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\nus"
  },
  {
    "path": "OnlineStore.Domain/app.config",
    "chars": 950,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-co"
  },
  {
    "path": "OnlineStore.Events/Bus/EventBus.cs",
    "chars": 3028,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading;\nusi"
  },
  {
    "path": "OnlineStore.Events/Bus/IBus.cs",
    "chars": 434,
    "preview": "using System;\nusing System.Collections.Generic;\nusing OnlineStore.Infrastructure;\n\nnamespace OnlineStore.Events.Bus\n{\n "
  },
  {
    "path": "OnlineStore.Events/Bus/IEventBus.cs",
    "chars": 87,
    "preview": "namespace OnlineStore.Events.Bus\n{\n    public interface IEventBus : IBus\n    {\n    }\n}"
  },
  {
    "path": "OnlineStore.Events/Bus/MsmqBusOptions.cs",
    "chars": 1109,
    "preview": "using System.Messaging;\n\nnamespace OnlineStore.Events.Bus\n{\n    public class MsmqBusOptions\n    {\n        public bool S"
  },
  {
    "path": "OnlineStore.Events/Bus/MsmqEventBus.cs",
    "chars": 4888,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Messaging;\nusing System.Reflection;\nusi"
  },
  {
    "path": "OnlineStore.Events/EventAggregator.cs",
    "chars": 6264,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Task"
  },
  {
    "path": "OnlineStore.Events/HandlesAsynchronouslyAttribute.cs",
    "chars": 218,
    "preview": "using System;\n\nnamespace OnlineStore.Events\n{\n    // 如果事件处理器添加了该属性,表示以异步的方式处理事件\n    [AttributeUsage(AttributeTargets.Cl"
  },
  {
    "path": "OnlineStore.Events/IEvent.cs",
    "chars": 183,
    "preview": "using System;\n\nnamespace OnlineStore.Events\n{\n    // 事件接口\n    public interface IEvent\n    {\n        Guid Id { get; }\n\n "
  },
  {
    "path": "OnlineStore.Events/IEventAggregator.cs",
    "chars": 621,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace OnlineStore.Events\n{\n    public interface IEventAggregator\n "
  },
  {
    "path": "OnlineStore.Events/IEventHandler.cs",
    "chars": 191,
    "preview": "namespace OnlineStore.Events\n{\n    // 事件处理器接口\n    public interface IEventHandler<in TEvent>\n        where TEvent : IEve"
  },
  {
    "path": "OnlineStore.Events/OnlineStore.Events.csproj",
    "chars": 3149,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "OnlineStore.Events/Properties/AssemblyInfo.cs",
    "chars": 961,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的常规信息通过以"
  },
  {
    "path": "OnlineStore.Events/app.config",
    "chars": 950,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-co"
  },
  {
    "path": "OnlineStore.Events.Handlers/OnlineStore.Events.Handlers.csproj",
    "chars": 3135,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "OnlineStore.Events.Handlers/Properties/AssemblyInfo.cs",
    "chars": 979,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的常规信息通过以"
  },
  {
    "path": "OnlineStore.Events.Handlers/SendEmailHandler.cs",
    "chars": 1278,
    "preview": "using System;\nusing OnlineStore.Domain.Events;\nusing OnlineStore.Infrastructure;\n\nnamespace OnlineStore.Events.Handlers"
  },
  {
    "path": "OnlineStore.Events.Handlers/app.config",
    "chars": 950,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-co"
  },
  {
    "path": "OnlineStore.Infrastructure/Caching/AppfabricCacheProvider.cs",
    "chars": 2262,
    "preview": "using System.Collections.Generic;\nusing Microsoft.ApplicationServer.Caching;\n\nnamespace OnlineStore.Infrastructure.Cach"
  },
  {
    "path": "OnlineStore.Infrastructure/Caching/CacheAttribute.cs",
    "chars": 707,
    "preview": "using System;\n\nnamespace OnlineStore.Infrastructure.Caching\n{\n    [AttributeUsage(AttributeTargets.Method, Inherited = "
  },
  {
    "path": "OnlineStore.Infrastructure/Caching/CachingMethod.cs",
    "chars": 185,
    "preview": "namespace OnlineStore.Infrastructure.Caching\n{\n    /// <summary>\n    /// 缓存方式\n    /// </summary>\n    public enum Cachin"
  },
  {
    "path": "OnlineStore.Infrastructure/Caching/EntLibCacheProvider.cs",
    "chars": 2162,
    "preview": "using System.Collections.Generic;\nusing Microsoft.Practices.EnterpriseLibrary.Caching;\n\nnamespace OnlineStore.Infrastru"
  },
  {
    "path": "OnlineStore.Infrastructure/Caching/ICacheProvider.cs",
    "chars": 610,
    "preview": "namespace OnlineStore.Infrastructure.Caching\n{\n    // 缓存接口的定义\n    public interface ICacheProvider\n    {\n        /// <su"
  },
  {
    "path": "OnlineStore.Infrastructure/DisposableObject.cs",
    "chars": 569,
    "preview": "using System;\n\nnamespace OnlineStore.Infrastructure\n{\n    public abstract class DisposableObject :IDisposable\n    {\n   "
  },
  {
    "path": "OnlineStore.Infrastructure/IUnitOfWork.cs",
    "chars": 109,
    "preview": "namespace OnlineStore.Infrastructure\n{\n    public interface IUnitOfWork\n    {\n        void Commit();\n    }\n}"
  },
  {
    "path": "OnlineStore.Infrastructure/InterceptionBehaviors/CachingBehavior.cs",
    "chars": 5518,
    "preview": "using OnlineStore.Infrastructure.Caching;\nusing Microsoft.Practices.Unity.InterceptionExtension;\nusing System;\nusing Sy"
  },
  {
    "path": "OnlineStore.Infrastructure/InterceptionBehaviors/ExceptionLoggingBehavior.cs",
    "chars": 1236,
    "preview": "using System.Collections.Generic;\nusing Microsoft.Practices.Unity.InterceptionExtension;\nusing System;\n\nnamespace Onlin"
  },
  {
    "path": "OnlineStore.Infrastructure/OnlineStore.Infrastructure.csproj",
    "chars": 6682,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "OnlineStore.Infrastructure/PagedResult.cs",
    "chars": 4317,
    "preview": "using System.Collections;\nusing System.Collections.Generic;\n\nnamespace OnlineStore.Infrastructure\n{\n    /// <summary>\n "
  },
  {
    "path": "OnlineStore.Infrastructure/Properties/AssemblyInfo.cs",
    "chars": 1404,
    "preview": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled "
  },
  {
    "path": "OnlineStore.Infrastructure/ServiceLocator.cs",
    "chars": 2875,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration.Internal;\nusing System.Diagnostics.CodeAnaly"
  },
  {
    "path": "OnlineStore.Infrastructure/Utils.cs",
    "chars": 1510,
    "preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Net;\nusing System.Net.Mail;\n\nnamespace OnlineStore.In"
  },
  {
    "path": "OnlineStore.Infrastructure/app.config",
    "chars": 950,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-co"
  },
  {
    "path": "OnlineStore.Infrastructure/packages.config",
    "chars": 459,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EnterpriseLibrary.Caching\" version=\"5.0.505.0\" targetF"
  },
  {
    "path": "OnlineStore.ModelDTO/OnlineStore.ModelDTO.csproj",
    "chars": 5700,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "OnlineStore.ModelDTO/Properties/AssemblyInfo.cs",
    "chars": 965,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的常规信息通过以"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OnlineStore.ModelDTO.OrderService.ShoppingCart.datasource",
    "chars": 641,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    This file is automatically generated by Visual Studio .Net. It is \n    "
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OrderService.disco",
    "chars": 366,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<discovery xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http:"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OrderService.wsdl",
    "chars": 3994,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<wsdl:definitions xmlns:wsap=\"http://schemas.xmlsoap.org/ws/2004/08/addressing/po"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OrderService.xsd",
    "chars": 1708,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:tns=\"http://tempuri.org/\" elementFormDefault=\"qualified\" targetN"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OrderService1.xsd",
    "chars": 2447,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:tns=\"http://schemas.microsoft.com/2003/10/Serialization/\" attrib"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/OrderService2.xsd",
    "chars": 5344,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns:"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/Reference.cs",
    "chars": 27602,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n/"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/Reference.svcmap",
    "chars": 2350,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ReferenceGroup xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\""
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/configuration.svcinfo",
    "chars": 1487,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configurationSnapshot xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xml"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/OrderService/configuration91.svcinfo",
    "chars": 19606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SavedWcfConfigurationInformation xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-ins"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/OnlineStore.ModelDTO.ProductService.Category.datasource",
    "chars": 637,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    This file is automatically generated by Visual Studio .Net. It is \n    "
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/OnlineStore.ModelDTO.ProductService.Product.datasource",
    "chars": 635,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    This file is automatically generated by Visual Studio .Net. It is \n    "
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService.disco",
    "chars": 370,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<discovery xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http:"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService.wsdl",
    "chars": 4642,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<wsdl:definitions xmlns:wsap=\"http://schemas.xmlsoap.org/ws/2004/08/addressing/po"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService.xsd",
    "chars": 3055,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema elementFormDefault=\"qualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSch"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService1.wsdl",
    "chars": 3065,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<wsdl:definitions xmlns:wsap=\"http://schemas.xmlsoap.org/ws/2004/08/addressing/po"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService1.xsd",
    "chars": 2447,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:tns=\"http://schemas.microsoft.com/2003/10/Serialization/\" attrib"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/ProductService2.xsd",
    "chars": 2502,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns:"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/Reference.cs",
    "chars": 13274,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n/"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/Reference.svcmap",
    "chars": 2564,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ReferenceGroup xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\""
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/configuration.svcinfo",
    "chars": 1517,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configurationSnapshot xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xml"
  },
  {
    "path": "OnlineStore.ModelDTO/Service References/ProductService/configuration91.svcinfo",
    "chars": 19630,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SavedWcfConfigurationInformation xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-ins"
  },
  {
    "path": "OnlineStore.ModelDTO/app.config",
    "chars": 933,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <system.serviceModel>\n        <bindings>\n            <basic"
  },
  {
    "path": "OnlineStore.Repositories/App.config",
    "chars": 1670,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Frame"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/CategoryRepository.cs",
    "chars": 438,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Do"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/EntityFrameworkRepository.cs",
    "chars": 14458,
    "preview": "using System;\nusing System.Collections.Generic;\nusing OnlineStore.Domain;\nusing System.Linq;\nusing OnlineStore.Domain.S"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/EntityFrameworkRepositoryContext.cs",
    "chars": 1755,
    "preview": "\nusing System;\nusing System.Data.Entity;\nusing System.Linq;\nusing System.Threading;\n\nnamespace OnlineStore.Repositories"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/IEntityFrameworkRepositoryContext.cs",
    "chars": 278,
    "preview": "using OnlineStore.Domain.Repositories;\n\nnamespace OnlineStore.Repositories.EntityFramework\n{\n    public interface IEnti"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/CategoryTypeConfiguration.cs",
    "chars": 650,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/OrderItemTypeConfiguration.cs",
    "chars": 676,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/OrderTypeConfiguration.cs",
    "chars": 579,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/ProductCategorizationTypeConfiguration.cs",
    "chars": 730,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/ProductTypeConfiguration.cs",
    "chars": 843,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/RoleTypeConfiguration.cs",
    "chars": 638,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/ShoppingCartItemTypeConfiguration.cs",
    "chars": 594,
    "preview": "using System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing OnlineStore.Doma"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/ShoppingCartTypeConfiguration.cs",
    "chars": 543,
    "preview": "using System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing OnlineStore.Doma"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/UserRoleTypeConfiguration.cs",
    "chars": 693,
    "preview": "using System;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing On"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ModelConfigurations/UserTypeConfiguration.cs",
    "chars": 1173,
    "preview": "using System.ComponentModel.DataAnnotations.Schema;\nusing System.Data.Entity.ModelConfiguration;\nusing OnlineStore.Doma"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/OnlineStoreDbContext.cs",
    "chars": 2360,
    "preview": "using System.Data.Entity;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Repositories.EntityFramework.ModelConfigura"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/OnlineStoreDbContextInitailizer.cs",
    "chars": 1040,
    "preview": "using System.Data.Entity;\n\nnamespace OnlineStore.Repositories.EntityFramework\n{\n    // DropCreateDatabaseIfModelChanges"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/OrderRepository.cs",
    "chars": 336,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\n\nnamespace OnlineStore.Repositories.EntityFramew"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ProductCategorizationRepository.cs",
    "chars": 2763,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Do"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ProductRepository.cs",
    "chars": 1010,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/RoleRepository.cs",
    "chars": 321,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\n\nnamespace OnlineStore.Repositories.EntityFramew"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ShoppingCartItemRepository.cs",
    "chars": 806,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\nusing OnlineStore.Domain.Specifications;\n\nnamesp"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/ShoppingCartRepository.cs",
    "chars": 348,
    "preview": "using OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\n\nnamespace OnlineStore.Repositories.EntityFramew"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/SortByExtension.cs",
    "chars": 4080,
    "preview": "using System;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing OnlineStore.Domain;\nusin"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/UserRepository.cs",
    "chars": 792,
    "preview": "using System;\nusing System.Linq.Expressions;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\nusi"
  },
  {
    "path": "OnlineStore.Repositories/EntityFramework/UserRoleRepository.cs",
    "chars": 1091,
    "preview": "using System;\nusing System.Linq;\nusing OnlineStore.Domain.Model;\nusing OnlineStore.Domain.Repositories;\n\n\nnamespace Onl"
  },
  {
    "path": "OnlineStore.Repositories/OnlineStore.Repositories.csproj",
    "chars": 6088,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "OnlineStore.Repositories/Properties/AssemblyInfo.cs",
    "chars": 1439,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "OnlineStore.Repositories/packages.config",
    "chars": 138,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"6.1.3\" targetFramework=\"net4"
  },
  {
    "path": "OnlineStore.ServiceContract/IOrderService.cs",
    "chars": 1737,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ServiceModel;\nusing OnlineStore.ServiceContracts.ModelDTOs"
  },
  {
    "path": "OnlineStore.ServiceContract/IProductService.cs",
    "chars": 4541,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.ServiceModel;\nusing System.Text;\nusing "
  },
  {
    "path": "OnlineStore.ServiceContract/IUserService.cs",
    "chars": 2793,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ServiceModel;\nusing OnlineStore.Infrastructure.Caching;\nus"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/AddressDto.cs",
    "chars": 303,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class AddressDto\n    {\n        public string Country { ge"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/CategoryDto.cs",
    "chars": 324,
    "preview": "using System.Collections.Generic;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class CategoryDto\n    "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/FaultData.cs",
    "chars": 960,
    "preview": "using System;\nusing System.Runtime.Serialization;\nusing System.ServiceModel;\n\nnamespace OnlineStore.ServiceContracts.Mo"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/OrderDto.cs",
    "chars": 993,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class Or"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/OrderItemDto.cs",
    "chars": 353,
    "preview": "using System.Collections.Generic;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class OrderItemDto\n   "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/OrderStatusDto.cs",
    "chars": 207,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public enum OrderStatusDto : int\n    {\n        Created = 0,\n    "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/Pagination.cs",
    "chars": 482,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    // 分页信息类\n    public class Pagination\n    {\n        public int Pa"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/ProductCategorizationDto.cs",
    "chars": 253,
    "preview": "using System;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class ProductCategorizationDto\n    {\n     "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/ProductDto.cs",
    "chars": 411,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class ProductDto\n    {\n        public string Id { get; se"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/ProductDtoWithPagination.cs",
    "chars": 251,
    "preview": "using System.Collections.Generic;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class ProductDtoWithPa"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/RoleDto.cs",
    "chars": 220,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class RoleDto\n    {\n        public string Id { get; set; "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/ShoppingCartDto.cs",
    "chars": 331,
    "preview": "using System.Collections.Generic;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class ShoppingCartDto\n"
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/ShoppingCartItemDto.cs",
    "chars": 336,
    "preview": "namespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class ShoppingCartItemDto\n    {\n        public string Id "
  },
  {
    "path": "OnlineStore.ServiceContract/ModelDTOs/UserDto.cs",
    "chars": 772,
    "preview": "using System;\n\nnamespace OnlineStore.ServiceContracts.ModelDTOs\n{\n    public class UserDto\n    {\n        public string "
  },
  {
    "path": "OnlineStore.ServiceContract/OnlineStore.ServiceContracts.csproj",
    "chars": 3653,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "OnlineStore.ServiceContract/Properties/AssemblyInfo.cs",
    "chars": 1445,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "OnlineStore.ServiceContract/app.config",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-co"
  },
  {
    "path": "OnlineStore.Web/App_Code/HtmlExtension.cs",
    "chars": 7916,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Web;\nusing System.Web.Routing;"
  },
  {
    "path": "OnlineStore.Web/App_Code/PermissionKeys.cs",
    "chars": 211,
    "preview": "using System;\n\nnamespace OnlineStore.Web\n{\n    [Flags]\n    public enum PermissionKeys\n    {\n        None = 0,\n        C"
  },
  {
    "path": "OnlineStore.Web/App_Code/UrlHelperExtension.cs",
    "chars": 419,
    "preview": "using System.Web.Mvc;\n\nnamespace OnlineStore.Web\n{\n    public static class UrlHelperExtension\n    {\n        public stat"
  },
  {
    "path": "OnlineStore.Web/App_Start/AuthConfig.cs",
    "chars": 936,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Microsoft.Web.WebPages.OAut"
  },
  {
    "path": "OnlineStore.Web/App_Start/BundleConfig.cs",
    "chars": 2134,
    "preview": "using System.Web;\nusing System.Web.Optimization;\n\nnamespace OnlineStore.Web\n{\n    public class BundleConfig\n    {\n     "
  },
  {
    "path": "OnlineStore.Web/App_Start/FilterConfig.cs",
    "chars": 267,
    "preview": "using System.Web;\nusing System.Web.Mvc;\n\nnamespace OnlineStore.Web\n{\n    public class FilterConfig\n    {\n        public"
  },
  {
    "path": "OnlineStore.Web/App_Start/RouteConfig.cs",
    "chars": 582,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Mvc;\nusing System"
  },
  {
    "path": "OnlineStore.Web/App_Start/WebApiConfig.cs",
    "chars": 463,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace OnlineStore.Web\n{\n"
  },
  {
    "path": "OnlineStore.Web/Content/Site.css",
    "chars": 9797,
    "preview": "body, td, th {\n    /*font-family: Arial, Helvetica, sans-serif;*/\n    font-family: 'Microsoft YaHei', '微软雅黑', 'SimSun',"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery-ui.css",
    "chars": 31418,
    "preview": "/*! jQuery UI - v1.8.20 - 2012-04-30\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.ui.core.css, jquery.ui.acc"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.accordion.css",
    "chars": 1044,
    "preview": "/*!\n * jQuery UI Accordion 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the MI"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.all.css",
    "chars": 269,
    "preview": "/*!\n * jQuery UI CSS Framework 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under th"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.autocomplete.css",
    "chars": 1063,
    "preview": "/*!\n * jQuery UI Autocomplete 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.base.css",
    "chars": 637,
    "preview": "/*!\n * jQuery UI CSS Framework 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under th"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.button.css",
    "chars": 2449,
    "preview": "/*!\n * jQuery UI Button 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the MIT l"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.core.css",
    "chars": 1295,
    "preview": "/*!\n * jQuery UI CSS Framework 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under th"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.datepicker.css",
    "chars": 4039,
    "preview": "/*!\n * jQuery UI Datepicker 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the M"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.dialog.css",
    "chars": 1336,
    "preview": "/*!\n * jQuery UI Dialog 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the MIT l"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.progressbar.css",
    "chars": 353,
    "preview": "/*!\n * jQuery UI Progressbar 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the "
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.resizable.css",
    "chars": 1135,
    "preview": "/*!\n * jQuery UI Resizable 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the MI"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.selectable.css",
    "chars": 301,
    "preview": "/*!\n * jQuery UI Selectable 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the M"
  },
  {
    "path": "OnlineStore.Web/Content/themes/base/jquery.ui.slider.css",
    "chars": 1118,
    "preview": "/*!\n * jQuery UI Slider 1.8.20\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Licensed under the MIT l"
  }
]

// ... and 347 more files (download for full content)

About this extraction

This page contains the full source code of the lizhi5753186/OnlineStore GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 547 files (38.7 MB), approximately 10.2M tokens, and a symbol index with 1287 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!