private UnityContainer GetLocalContainer()
		{
			#region Common Settings for Web and Services

			var container = new UnityContainer();
			container.RegisterType<IKnownSerializationTypes, CatalogEntityFactory>("catalog",
																				   new ContainerControlledLifetimeManager
																					   ());

			//container.RegisterType<IKnowSerializationTypes, OrderEntityFactory>("order", new ContainerControlledLifetimeManager(), null);
			container.RegisterInstance<IConsumerFactory>(new DomainAssemblyScannerConsumerFactory(container));
			container.RegisterType<IKnownSerializationTypes, DomainAssemblyScannerConsumerFactory>("scaned",
																								   new ContainerControlledLifetimeManager
																									   (),
																								   new InjectionConstructor
																									   (container));



			container.RegisterType<IConsumerFactory, DomainAssemblyScannerConsumerFactory>();
			container.RegisterType<ISystemObserver, NullSystemObserver>();
			container.RegisterType<IEngineProcess, SingleThreadConsumingProcess>();
			container.RegisterType<IMessageSerializer, DataContractMessageSerializer>();

			container.RegisterType<IQueueWriter, InMemoryQueueWriter>();
			container.RegisterType<IQueueReader, InMemoryQueueReader>();

			container.RegisterType<IMessageSender, DefaultMessageSender>(new ContainerControlledLifetimeManager());
			container.RegisterType<ICurrencyService, CurrencyService>(new ContainerControlledLifetimeManager());

			//container.RegisterType<ICacheProvider, InMemCachingProvider>();
			container.RegisterType<ICacheRepository, HttpCacheRepository>();
			container.RegisterType<IOperationLogRepository, OperationLogContext>();
			container.RegisterType<ILogOperationFactory, LogOperationFactory>();

			//Register Sequences
			container.RegisterType<ISequenceService, SequenceService>();

			//Register Template and Email service
			container.RegisterType<ITemplateService, TemplateService>();

			container.RegisterType<IEmailService, NetEmailService>();


			#region Interceptors

			// register interceptors
			container.RegisterType<IInterceptor, AuditChangeInterceptor>("audit");
			container.RegisterType<IInterceptor, LogInterceptor>("log");
			container.RegisterType<IInterceptor, EntityEventInterceptor>("events");

			#endregion

			#region Marketing

			container.RegisterType<IMarketingRepository, EFMarketingRepository>(new InjectionConstructor(MarketingDatabaseName));
			container.RegisterType<IMarketingEntityFactory, MarketingEntityFactory>();
			container.RegisterType<IPromotionUsageProvider, PromotionUsageProvider>();
			container.RegisterType<IPromotionEntryPopulate, PromotionEntryPopulate>();

			#endregion

			//#region Search
			container.RegisterInstance<ISearchConnection>(
				new SearchConnection(
					ConnectionHelper.GetConnectionString("SearchConnectionString")));
			container.RegisterType<ISearchService, SearchService>(new HierarchicalLifetimeManager());
			container.RegisterType<ISearchIndexController, SearchIndexController>();
			container.RegisterType<IBuildSettingsRepository, EFSearchRepository>();
			container.RegisterType<ISearchEntityFactory, SearchEntityFactory>(new ContainerControlledLifetimeManager());
			container.RegisterType<ISearchProvider, FakeSarchProvider>();
			container.RegisterType<ISearchQueryBuilder, ElasticSearchQueryBuilder>();
			container.RegisterType<ISearchIndexBuilder, CatalogItemIndexBuilder>("catalogitem");

			//#endregion

			#region Assets

			container.RegisterType<IAssetEntityFactory, AssetEntityFactory>();


			// using local storage assets
			container.RegisterType<IAssetRepository, FileSystemBlobAssetRepository>();
			container.RegisterType<IBlobStorageProvider, FileSystemBlobAssetRepository>();
			container.RegisterType<IAssetUrl, FileSystemAssetUrl>();

			container.RegisterType<IAssetService, AssetService>();
			#endregion

			#region Catalog
			container.RegisterType<ICatalogEntityFactory, CatalogEntityFactory>(new ContainerControlledLifetimeManager());

			container.RegisterType<ICatalogRepository, EFCatalogRepository>(new InjectionConstructor(CatalogDatabaseName));
            container.RegisterType<ICatalogOutlineBuilder, CatalogOutlineBuilder>();
			container.RegisterType<IPricelistRepository, EFCatalogRepository>(new InjectionConstructor(CatalogDatabaseName));
			container.RegisterType<ICatalogService, CatalogService>();
			container.RegisterType<IPriceListAssignmentEvaluator, PriceListAssignmentEvaluator>();
			container.RegisterType<IPriceListAssignmentEvaluationContext, PriceListAssignmentEvaluationContext>();

			container.RegisterType<IImportJobEntityFactory, ImportJobEntityFactory>(
				new ContainerControlledLifetimeManager());
			container.RegisterType<IImportRepository, EFImportingRepository>();
			container.RegisterType<IImportService, ImportService>();
			#endregion

			#region Customer

			container.RegisterType<ICustomerEntityFactory, CustomerEntityFactory>(
				new ContainerControlledLifetimeManager());

			container.RegisterType<ICustomerRepository, EFCustomerRepository>();
			container.RegisterType<ICustomerSessionService, CustomerSessionService>();

			#endregion

			#region Inventory

			container.RegisterType<IInventoryEntityFactory, InventoryEntityFactory>(
				new ContainerControlledLifetimeManager());
			container.RegisterType<IInventoryRepository, EFInventoryRepository>();

			#endregion

			#region Order

			container.RegisterType<IOrderEntityFactory, OrderEntityFactory>(new ContainerControlledLifetimeManager());

			var activityProvider = WorkflowConfiguration.Instance.DefaultActivityProvider;
			var workflowService = new WFWorkflowService(activityProvider);
			container.RegisterInstance<IWorkflowService>(workflowService);
			container.RegisterType<IOrderStateController, OrderStateController>();

			container.RegisterType<IOrderRepository, EFOrderRepository>();
			container.RegisterType<IShippingRepository, EFOrderRepository>();
			container.RegisterType<IPaymentMethodRepository, EFOrderRepository>();
			container.RegisterType<ITaxRepository, EFOrderRepository>();

			container.RegisterType<ICountryRepository, EFOrderRepository>();
			container.RegisterType<IOrderService, OrderService>();

			#endregion

			#region Review

			container.RegisterType<IReviewEntityFactory, ReviewEntityFactory>(new ContainerControlledLifetimeManager());

			container.RegisterType<IReviewRepository, EFReviewRepository>();

			#endregion

			#region Security

			container.RegisterType<ISecurityEntityFactory, SecurityEntityFactory>(
				new ContainerControlledLifetimeManager());
			container.RegisterType<ISecurityRepository, EFSecurityRepository>();
			container.RegisterType<IUserSecurity, WebUserSecurity>();
			container.RegisterType<IAuthenticationService, AuthenticationService>();
			container.RegisterType<ISecurityService, SecurityService>();
			container.RegisterType<IOAuthWebSecurity, OAuthWebSecurityWrapper>();

			#endregion

			#region Store

			container.RegisterType<IStoreEntityFactory, StoreEntityFactory>(new ContainerControlledLifetimeManager());

			container.RegisterType<IStoreService, StoreService>();
			container.RegisterType<IStoreRepository, EFStoreRepository>(new InjectionConstructor(StoreDatabaseName));

			#endregion

			#endregion

			#region MVC Helpers

			container.RegisterType<MarketingHelper>();
			container.RegisterType<PriceListClient>();
			container.RegisterType<StoreClient>();
			container.RegisterType<CatalogClient>();
			container.RegisterType<UserClient>();
			container.RegisterType<ShippingClient>();
			container.RegisterType<PromotionClient>();
			container.RegisterType<DynamicContentClient>();
			container.RegisterType<CountryClient>();
			container.RegisterType<OrderClient>();
			container.RegisterType<DisplayTemplateClient>();
			container.RegisterType<SettingsClient>();
			container.RegisterType<SequencesClient>();
			container.RegisterType<IPaymentOption, CreditCardOption>("creditcard");

			#endregion

			#region DynamicContent

			container.RegisterType<IDynamicContentService, DynamicContentService>();
			container.RegisterType<IDynamicContentRepository, EFDynamicContentRepository>();
			container.RegisterType<IDynamicContentEvaluator, DynamicContentEvaluator>();

			#endregion

			#region AppConfig

			container.RegisterType<IAppConfigRepository, EFAppConfigRepository>(new InjectionConstructor(AppConfigDatabaseName));
			container.RegisterType<IAppConfigEntityFactory, AppConfigEntityFactory>();

			#endregion

			#region DisplayTemplates

			container.RegisterType<IDisplayTemplatesService, DisplayTemplatesService>();
			container.RegisterType<IDisplayTemplateEvaluator, DisplayTemplateEvaluator>();

			#endregion

			#region Events

			// Register event listeners
			container.RegisterType<IEntityEventListener, OrderChangeEventListener>("order");
			container.RegisterType<IEntityEventListener, PublicReplyEventListener>("customer");
			container.RegisterType<IEntityEventListener, CaseChangeEventListener>("customer");
            container.RegisterType<IEntityEventListener, ReviewApprovedEventListener>("review");
			container.RegisterType<IEntityEventContext, EntityEventContext>(new ContainerControlledLifetimeManager());

			#endregion

			#region Globalization

			//For using database resources
			container.RegisterType<IElementRepository, DatabaseElementRepository>();
			//For using Local Resources
			//container.RegisterInstance<IElementRepository>(new CacheElementRepository(new XmlElementRepository()));

			#endregion

            #region OutputCache

            container.RegisterType<IKeyBuilder, KeyBuilder>();
            container.RegisterType<IKeyGenerator, KeyGenerator>();
            container.RegisterType<IDonutHoleFiller, DonutHoleFiller>();
            container.RegisterType<ICacheHeadersHelper, CacheHeadersHelper>();
            container.RegisterType<ICacheSettingsManager, CacheSettingsManager>();
            container.RegisterType<IReadWriteOutputCacheManager, OutputCacheManager>();
            container.RegisterInstance<IActionSettingsSerialiser>(new EncryptingActionSettingsSerialiser(new ActionSettingsSerialiser(), new Encryptor()));
            container.RegisterType<ICacheService, CacheService>();

            #endregion

			container.RegisterInstance<IUnityContainer>(container);
			return container;
		}
        /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            #region Common Settings for Web and Services

            // this section is common for both web application and services application and should be kept identical
            var isAzure = AzureCommonHelper.IsAzureEnvironment();

            container.RegisterType<IKnownSerializationTypes, CatalogEntityFactory>("catalog",
                                                                                   new ContainerControlledLifetimeManager
                                                                                       ());

            //container.RegisterType<IKnowSerializationTypes, OrderEntityFactory>("order", new ContainerControlledLifetimeManager(), null);
            container.RegisterInstance<IConsumerFactory>(new DomainAssemblyScannerConsumerFactory(container));
            container.RegisterType<IKnownSerializationTypes, DomainAssemblyScannerConsumerFactory>("scaned",
                                                                                                   new ContainerControlledLifetimeManager
                                                                                                       (),
                                                                                                   new InjectionConstructor
                                                                                                       (container));



            container.RegisterType<IConsumerFactory, DomainAssemblyScannerConsumerFactory>();
            container.RegisterType<ISystemObserver, NullSystemObserver>();
            container.RegisterType<IEngineProcess, SingleThreadConsumingProcess>();
            container.RegisterType<IMessageSerializer, DataContractMessageSerializer>();
            if (isAzure)
            {
                container.RegisterType<IQueueWriter, AzureQueueWriter>();
                container.RegisterType<IQueueReader, AzureQueueReader>();
            }
            else
            {
                container.RegisterType<IQueueWriter, InMemoryQueueWriter>();
                container.RegisterType<IQueueReader, InMemoryQueueReader>();
            }
            container.RegisterType<IMessageSender, DefaultMessageSender>(new ContainerControlledLifetimeManager());
            container.RegisterType<ICurrencyService, CurrencyService>(new ContainerControlledLifetimeManager());

            //container.RegisterType<ICacheProvider, InMemCachingProvider>();
            container.RegisterType<ICacheRepository, HttpCacheRepository>();
            container.RegisterType<IOperationLogRepository, OperationLogContext>(new PerRequestLifetimeManager());
            container.RegisterType<ILogOperationFactory, LogOperationFactory>();

            //Register Sequences
            container.RegisterType<ISequenceService, SequenceService>();

            //Register Template and Email service
            container.RegisterType<ITemplateService, TemplateService>();

            if (isAzure)
            {
                container.RegisterType<IEmailService, AzureEmailService>();
            }
            else
            {
                container.RegisterType<IEmailService, NetEmailService>();
            }

            container.RegisterType<ICatalogOutlineBuilder, CatalogOutlineBuilder>();

            #region Interceptors

            // register interceptors
            container.RegisterType<IInterceptor, AuditChangeInterceptor>("audit");
            container.RegisterType<IInterceptor, LogInterceptor>("log");
            container.RegisterType<IInterceptor, EntityEventInterceptor>("events");

            #endregion

            #region Marketing

            container.RegisterType<IMarketingRepository, EFMarketingRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IMarketingEntityFactory, MarketingEntityFactory>();
            container.RegisterType<IPromotionUsageProvider, PromotionUsageProvider>();
            container.RegisterType<IPromotionEntryPopulate, PromotionEntryPopulate>();

            //Register prmotion evaluation policies
            container.RegisterType<IEvaluationPolicy, GlobalExclusivityPolicy>("global");
            container.RegisterType<IEvaluationPolicy, GroupExclusivityPolicy>("group");
            container.RegisterType<IEvaluationPolicy, CartSubtotalRewardCombinePolicy>("cart");
            container.RegisterType<IEvaluationPolicy, ShipmentRewardCombinePolicy>("shipment");


            container.RegisterType<IPromotionEvaluator, DefaultPromotionEvaluator>();

            #endregion

            #region Search

            var searchConnection = new SearchConnection(ConnectionHelper.GetConnectionString("SearchConnectionString"));
            container.RegisterInstance<ISearchConnection>(searchConnection);
            container.RegisterType<ISearchService, SearchService>(new HierarchicalLifetimeManager());
            container.RegisterType<ISearchIndexController, SearchIndexController>();
            container.RegisterType<IBuildSettingsRepository, EFSearchRepository>(new PerRequestLifetimeManager());
            container.RegisterType<ISearchEntityFactory, SearchEntityFactory>(new ContainerControlledLifetimeManager());
            container.RegisterType<ISearchIndexBuilder, CatalogItemIndexBuilder>("catalogitem");

            // If provider specified as lucene, use lucene libraries, otherwise use default, which is elastic search
            if (string.Equals(searchConnection.Provider, SearchProviders.Lucene.ToString(), StringComparison.OrdinalIgnoreCase))
            {
                // Lucene Search implementation
                container.RegisterType<ISearchProvider, LuceneSearchProvider>();
                container.RegisterType<ISearchQueryBuilder, LuceneSearchQueryBuilder>();
            }
            else
            {
                container.RegisterType<ISearchProvider, ElasticSearchProvider>();
                container.RegisterType<ISearchQueryBuilder, ElasticSearchQueryBuilder>();
            }
            #endregion

            #region Assets

            container.RegisterType<IAssetEntityFactory, AssetEntityFactory>();

            // using azure assets
            if (isAzure)
            {
                container.RegisterType<IAssetRepository, AzureBlobAssetRepository>();
                container.RegisterType<IBlobStorageProvider, AzureBlobAssetRepository>();
                container.RegisterType<IAssetUrl, AzureBlobAssetRepository>();
            }
            else
            {
                // using local storage assets
                container.RegisterType<IAssetRepository, FileSystemBlobAssetRepository>();
                container.RegisterType<IBlobStorageProvider, FileSystemBlobAssetRepository>();
                container.RegisterType<IAssetUrl, FileSystemAssetUrl>();
            }

            container.RegisterType<IAssetService, AssetService>();
            #endregion

            #region Catalog
            container.RegisterType<ICatalogEntityFactory, CatalogEntityFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType<ICatalogRepository, EFCatalogRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IPricelistRepository, EFCatalogRepository>(new PerRequestLifetimeManager());
            container.RegisterType<ICatalogService, CatalogService>();
            container.RegisterType<IPriceListAssignmentEvaluator, PriceListAssignmentEvaluator>();
            container.RegisterType<IPriceListAssignmentEvaluationContext, PriceListAssignmentEvaluationContext>();

            container.RegisterType<IImportJobEntityFactory, ImportJobEntityFactory>(
                new ContainerControlledLifetimeManager());
            container.RegisterType<IImportRepository, EFImportingRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IImportService, ImportService>();
            #endregion

            #region Customer

            container.RegisterType<ICustomerEntityFactory, CustomerEntityFactory>(
                new ContainerControlledLifetimeManager());

            container.RegisterType<ICustomerRepository, EFCustomerRepository>(new PerRequestLifetimeManager());
            container.RegisterType<ICustomerSessionService, CustomerSessionService>();

            #endregion

            #region Inventory

            container.RegisterType<IInventoryEntityFactory, InventoryEntityFactory>(
                new ContainerControlledLifetimeManager());
            container.RegisterType<IInventoryRepository, EFInventoryRepository>(new PerRequestLifetimeManager());

            #endregion

            #region Order

            container.RegisterType<IOrderEntityFactory, OrderEntityFactory>(new ContainerControlledLifetimeManager());

            var activityProvider = WorkflowConfiguration.Instance.DefaultActivityProvider;
            var workflowService = new WFWorkflowService(activityProvider);
            container.RegisterInstance<IWorkflowService>(workflowService);
            container.RegisterType<IOrderStateController, OrderStateController>();

            container.RegisterType<IOrderRepository, EFOrderRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IShippingRepository, EFOrderRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IPaymentMethodRepository, EFOrderRepository>(new PerRequestLifetimeManager());
            container.RegisterType<ITaxRepository, EFOrderRepository>(new PerRequestLifetimeManager());

            container.RegisterType<ICountryRepository, EFOrderRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IOrderService, OrderService>();

            #endregion

            #region Review

            container.RegisterType<IReviewEntityFactory, ReviewEntityFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType<IReviewRepository, EFReviewRepository>(new PerRequestLifetimeManager());

            #endregion

            #region Security

            container.RegisterType<ISecurityEntityFactory, SecurityEntityFactory>(
                new ContainerControlledLifetimeManager());
            container.RegisterType<ISecurityRepository, EFSecurityRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IUserSecurity, WebUserSecurity>();
            container.RegisterType<IAuthenticationService, AuthenticationService>();
            container.RegisterType<ISecurityService, SecurityService>();
            container.RegisterType<IOAuthWebSecurity, OAuthWebSecurityWrapper>();

            #endregion

            #region Store

            container.RegisterType<IStoreEntityFactory, StoreEntityFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType<IStoreService, StoreService>();
            container.RegisterType<IStoreRepository, EFStoreRepository>(new PerRequestLifetimeManager());

            #endregion

            #region Reporting

            container.RegisterType<IReportingService, ReportingService>();
            #endregion

            #endregion

            #region MVC Helpers

            //container.RegisterType<MarketingHelper>();
            container.RegisterType<PriceListClient>();
            container.RegisterType<StoreClient>();
            container.RegisterType<CatalogClient>();
            container.RegisterType<UserClient>();
            container.RegisterType<ShippingClient>();
            container.RegisterType<PromotionClient>();
            container.RegisterType<DynamicContentClient>();
            container.RegisterType<CountryClient>();
            container.RegisterType<OrderClient>();
            container.RegisterType<DisplayTemplateClient>();
            container.RegisterType<SettingsClient>();
            container.RegisterType<SequencesClient>();
            container.RegisterType<SeoKeywordClient>(new PerRequestLifetimeManager());
            container.RegisterType<ReviewClient>();
            //container.RegisterType<IPaymentOption, CreditCardOption>("creditcard");

            #endregion

            #region DynamicContent

            container.RegisterType<IDynamicContentService, DynamicContentService>();
            container.RegisterType<IDynamicContentRepository, EFDynamicContentRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IDynamicContentEvaluator, DynamicContentEvaluator>();

            #endregion

            #region AppConfig

            container.RegisterType<IAppConfigRepository, EFAppConfigRepository>(new PerRequestLifetimeManager());
            container.RegisterType<IAppConfigEntityFactory, AppConfigEntityFactory>(new ContainerControlledLifetimeManager());

            #endregion

            #region DisplayTemplates

            container.RegisterType<IDisplayTemplatesService, DisplayTemplatesService>();
            container.RegisterType<IDisplayTemplateEvaluator, DisplayTemplateEvaluator>();

            #endregion

            #region Events

            // Register event listeners
            container.RegisterType<IEntityEventListener, OrderChangeEventListener>("order");
            container.RegisterType<IEntityEventListener, PublicReplyEventListener>("customer");
            container.RegisterType<IEntityEventListener, CaseChangeEventListener>("customer");
            container.RegisterType<IEntityEventContext, EntityEventContext>(new PerRequestLifetimeManager());

            #endregion

            #region Jobs

            container.RegisterType<GenerateSearchIndexWork>();
            container.RegisterType<ProcessOrderStatusWork>();
            container.RegisterType<ProcessSearchIndexWork>();

            #endregion

            #region OutputCache

            container.RegisterType<IKeyBuilder, KeyBuilder>(new PerRequestLifetimeManager());
            container.RegisterType<IKeyGenerator, KeyGenerator>(new PerRequestLifetimeManager());
            container.RegisterType<IDonutHoleFiller, DonutHoleFiller>(new PerRequestLifetimeManager());
            container.RegisterType<ICacheHeadersHelper, CacheHeadersHelper>(new PerRequestLifetimeManager());
            container.RegisterType<ICacheSettingsManager, CacheSettingsManager>(new PerRequestLifetimeManager());
            container.RegisterType<IReadWriteOutputCacheManager, OutputCacheManager>(new PerRequestLifetimeManager());
            container.RegisterInstance<IActionSettingsSerialiser>(new EncryptingActionSettingsSerialiser(new ActionSettingsSerialiser(), new Encryptor()));
            container.RegisterType<ICacheService, CacheService>();

            #endregion

            #region Globalization

            //For using database resources
            container.RegisterType<IElementRepository, DatabaseElementRepository>(new PerRequestLifetimeManager());
            //For using Local Resources
            //container.RegisterInstance<IElementRepository>(new CacheElementRepository(new XmlElementRepository()));

            #endregion

            container.RegisterInstance(container);
        }
		private static UnityContainer GetLocalContainer()
		{
			var container = new UnityContainer();
			container.RegisterInstance<IUnityContainer>(container);
			container.RegisterType<IKnownSerializationTypes, CatalogEntityFactory>("catalog", new ContainerControlledLifetimeManager());
			container.RegisterInstance<IConsumerFactory>(new DomainAssemblyScannerConsumerFactory(container));
			container.RegisterType<IKnownSerializationTypes, DomainAssemblyScannerConsumerFactory>("scaned", new ContainerControlledLifetimeManager(), new InjectionConstructor(container));
			container.RegisterType<IConsumerFactory, DomainAssemblyScannerConsumerFactory>();
			container.RegisterType<ISystemObserver, NullSystemObserver>();
			container.RegisterType<IEngineProcess, SingleThreadConsumingProcess>();
			container.RegisterType<IMessageSerializer, DataContractMessageSerializer>();
			container.RegisterType<IQueueWriter, InMemoryQueueWriter>();
			container.RegisterType<IQueueReader, InMemoryQueueReader>();
			container.RegisterType<IMessageSender, DefaultMessageSender>(new ContainerControlledLifetimeManager());
			container.RegisterType<ISearchService, SearchService>();
			container.RegisterType<ISearchProvider, ElasticSearchProvider>();
			container.RegisterType<ISearchQueryBuilder, ElasticSearchQueryBuilder>();
			container.RegisterType<ISearchIndexBuilder, CatalogItemIndexBuilder>("catalogitem");
			container.RegisterType<IOperationLogRepository, OperationLogContext>();
			container.RegisterType<ILogOperationFactory, LogOperationFactory>();
			container.RegisterType<IBuildSettingsRepository, EFSearchRepository>();
			container.RegisterType<ISearchEntityFactory, SearchEntityFactory>(new ContainerControlledLifetimeManager());
			container.RegisterType<ISearchIndexController, SearchIndexController>();
			container.RegisterType<ICacheRepository, HttpCacheRepository>();

			#region Marketing
			container.RegisterType<IMarketingRepository, EFMarketingRepository>();
			container.RegisterType<IMarketingEntityFactory, MarketingEntityFactory>();
			container.RegisterType<IPromotionUsageProvider, PromotionUsageProvider>();
			container.RegisterType<IPromotionEntryPopulate, PromotionEntryPopulate>();
			#endregion

			#region Catalog
			container.RegisterType<ICatalogEntityFactory, CatalogEntityFactory>(new ContainerControlledLifetimeManager());

			container.RegisterType<ICatalogRepository, EFCatalogRepository>();
			container.RegisterType<IPricelistRepository, EFCatalogRepository>();
			container.RegisterType<ICatalogService, CatalogService>();

			container.RegisterType<IPriceListAssignmentEvaluator, PriceListAssignmentEvaluator>();
			container.RegisterType<IPriceListAssignmentEvaluationContext, PriceListAssignmentEvaluationContext>();
			#endregion

			#region Customer
			container.RegisterType<ICustomerEntityFactory, CustomerEntityFactory>(new ContainerControlledLifetimeManager());
			container.RegisterType<ICustomerRepository, EFCustomerRepository>();
			container.RegisterType<ICustomerSessionService, CustomerSessionService>();
			#endregion

			#region Inventory
			container.RegisterType<IInventoryEntityFactory, InventoryEntityFactory>(new ContainerControlledLifetimeManager());
			container.RegisterType<IInventoryRepository, EFInventoryRepository>();
			#endregion

			#region Order
			container.RegisterType<IOrderEntityFactory, OrderEntityFactory>(new ContainerControlledLifetimeManager());

			var activityProvider = WorkflowConfiguration.Instance.DefaultActivityProvider;
			var workflowService = new WFWorkflowService(activityProvider);
			container.RegisterInstance<IWorkflowService>(workflowService);

			container.RegisterType<IOrderRepository, EFOrderRepository>();
			container.RegisterType<ITaxRepository, EFOrderRepository>();
			container.RegisterType<IShippingRepository, EFOrderRepository>();
			container.RegisterType<IPaymentMethodRepository, EFOrderRepository>();

			container.RegisterType<ICountryRepository, EFOrderRepository>();
			container.RegisterType<IOrderService, OrderService>();
			#endregion

			#region Store
			container.RegisterType<IStoreEntityFactory, StoreEntityFactory>(new ContainerControlledLifetimeManager());

			container.RegisterType<IStoreService, StoreService>();
			container.RegisterType<IStoreRepository, EFStoreRepository>();
			#endregion

			return container;
		}
        private static IUnityContainer BuildUnityContainer()
        {
            #region Common Settings for Web and Services
            // this section is common for both web application and services application and should be kept identical
            var container = new UnityContainer();

            container.RegisterType<IKnownSerializationTypes, CatalogEntityFactory>("catalog", new ContainerControlledLifetimeManager());
            //container.RegisterType<IKnowSerializationTypes, OrderEntityFactory>("order", new ContainerControlledLifetimeManager(), null);
            container.RegisterInstance<IConsumerFactory>(new DomainAssemblyScannerConsumerFactory(container));
            container.RegisterType<IKnownSerializationTypes, DomainAssemblyScannerConsumerFactory>("scaned", new ContainerControlledLifetimeManager(), new InjectionConstructor(container));
            container.RegisterType<IConsumerFactory, DomainAssemblyScannerConsumerFactory>();
            container.RegisterType<ISystemObserver, NullSystemObserver>();
            container.RegisterType<IEngineProcess, SingleThreadConsumingProcess>();
            container.RegisterType<IMessageSerializer, DataContractMessageSerializer>();
            container.RegisterType<IQueueWriter, AzureQueueWriter>();
            container.RegisterType<IQueueReader, AzureQueueReader>();
            container.RegisterType<IMessageSender, DefaultMessageSender>(new ContainerControlledLifetimeManager());
            container.RegisterType<ICurrencyService, CurrencyService>(new ContainerControlledLifetimeManager());

            //container.RegisterType<ICacheProvider, InMemCachingProvider>();
            container.RegisterType<ICacheRepository, HttpCacheRepository>();

            container.RegisterType<ILogOperationFactory, LogOperationFactory>();
            container.RegisterType<IOperationLogRepository, OperationLogContext>();

            #region Interceptors

            // register interceptors
            container.RegisterType<IInterceptor, AuditChangeInterceptor>("audit");
            //container.RegisterType<IInterceptor, LogInterceptor>("log");
            //container.RegisterType<IInterceptor, EntityEventInterceptor>("events");

            #endregion

            #region Marketing
            //Needed for RemoveExpiredPromotionReservations SystemJob
            container.RegisterType<IMarketingRepository, EFMarketingRepository>();
            container.RegisterType<IMarketingEntityFactory, MarketingEntityFactory>();
            //container.RegisterType<IPromotionUsageProvider, PromotionUsageProvider>();
            //container.RegisterType<IPromotionEntryPopulate, PromotionEntryPopulate>();
            //container.RegisterType<IDynamicContentRepository, EFDynamicContentRepository>();
            #endregion

            #region Search
            var connectionString = ConnectionHelper.GetConnectionString("SearchConnectionString");
            if (connectionString == null)
            {
                Logger.Error("connectionString is null");
            }

            var searchConnection = new SearchConnection(connectionString);
            container.RegisterInstance<ISearchConnection>(searchConnection);

            container.RegisterType<ISearchService, SearchService>(new HierarchicalLifetimeManager());
            container.RegisterType<ISearchIndexController, SearchIndexController>();
            container.RegisterType<IBuildSettingsRepository, EFSearchRepository>();
            container.RegisterType<ISearchEntityFactory, SearchEntityFactory>(new ContainerControlledLifetimeManager());
            container.RegisterType<ISearchIndexBuilder, CatalogItemIndexBuilder>("catalogitem");

            // If provider specified as lucene, use lucene libraries, otherwise use default, which is elastic search
            if (string.Equals(searchConnection.Provider, SearchProviders.Lucene.ToString(), StringComparison.OrdinalIgnoreCase))
            {
                // Lucene Search implementation
                container.RegisterType<ISearchProvider, LuceneSearchProvider>();
                container.RegisterType<ISearchQueryBuilder, LuceneSearchQueryBuilder>();
            }
            else
            {
                container.RegisterType<ISearchProvider, ElasticSearchProvider>();
                container.RegisterType<ISearchQueryBuilder, ElasticSearchQueryBuilder>();
            }

            #endregion

            #region AppConfig
            container.RegisterType<IAppConfigEntityFactory, AppConfigEntityFactory>();
            container.RegisterType<IAppConfigRepository, EFAppConfigRepository>();
            #endregion

            #region Assets
            container.RegisterType<IAssetEntityFactory, AssetEntityFactory>();
            container.RegisterType<IAssetRepository, AzureBlobAssetRepository>();
            container.RegisterType<IBlobStorageProvider, AzureBlobAssetRepository>();
            container.RegisterType<IAssetService, AssetService>();
            #endregion

            #region Catalog
            container.RegisterType<ICatalogEntityFactory, CatalogEntityFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType<ICatalogRepository, EFCatalogRepository>();
            container.RegisterType<ICatalogOutlineBuilder, CatalogOutlineBuilder>();
            container.RegisterType<IPricelistRepository, EFCatalogRepository>();
            container.RegisterType<ICatalogService, CatalogService>();
            container.RegisterType<IPriceListAssignmentEvaluator, PriceListAssignmentEvaluator>();
            container.RegisterType<IPriceListAssignmentEvaluationContext, PriceListAssignmentEvaluationContext>();

            container.RegisterType<IImportJobEntityFactory, ImportJobEntityFactory>(
                new ContainerControlledLifetimeManager());
            container.RegisterType<IImportRepository, EFImportingRepository>();
            container.RegisterType<IImportService, ImportService>();
            #endregion

            //#region Customer
            //container.RegisterType<ICustomerEntityFactory, CustomerEntityFactory>(new ContainerControlledLifetimeManager());

            //container.RegisterType<ICustomerRepository, EFCustomerRepository>();
            //#endregion

            //#region Inventory
            //container.RegisterType<IInventoryEntityFactory, InventoryEntityFactory>(new ContainerControlledLifetimeManager());
            //#endregion

            #region Order
            container.RegisterType<IOrderEntityFactory, OrderEntityFactory>(new ContainerControlledLifetimeManager());

            var activityProvider = WorkflowConfiguration.Instance.DefaultActivityProvider;
            var workflowService = new WFWorkflowService(activityProvider);
            container.RegisterInstance<IWorkflowService>(workflowService);
            container.RegisterType<IOrderStateController, OrderStateController>();

            container.RegisterType<IOrderRepository, EFOrderRepository>();
            container.RegisterType<IShippingRepository, EFOrderRepository>();
            container.RegisterType<IPaymentMethodRepository, EFOrderRepository>();
            container.RegisterType<ITaxRepository, EFOrderRepository>();

            container.RegisterType<ICountryRepository, EFOrderRepository>();
            container.RegisterType<IOrderService, OrderService>();
            #endregion

            #region Customer
            container.RegisterType<ICustomerEntityFactory, CustomerEntityFactory>(
     new ContainerControlledLifetimeManager());

            container.RegisterType<ICustomerRepository, EFCustomerRepository>();
            container.RegisterType<ICustomerSessionService, CustomerSessionService>();
            #endregion

            #region Review
            container.RegisterType<IReviewEntityFactory, ReviewEntityFactory>(new ContainerControlledLifetimeManager());
            container.RegisterType<IReviewRepository, EFReviewRepository>();
            #endregion

            #region Security
            container.RegisterType<ISecurityEntityFactory, SecurityEntityFactory>(new ContainerControlledLifetimeManager());

            //container.RegisterType<ISecurityService, SecurityService>();
            container.RegisterType<ISecurityRepository, EFSecurityRepository>();
            #endregion


            #region Store
            container.RegisterType<IStoreEntityFactory, StoreEntityFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType<IStoreService, StoreService>();
            container.RegisterType<IStoreRepository, EFStoreRepository>();
            #endregion
            #endregion

            container.RegisterType<GenerateSearchIndexWork>();
            container.RegisterType<ProcessOrderStatusWork>();
            container.RegisterType<ProcessSearchIndexWork>();

            return container;
        }