public DbEntityResolver(Options?options, IServiceProvider services) : base(services)
        {
            options ??= new();
            BatchProcessorFactory = options.BatchProcessorFactory ??
                                    (self => new AsyncBatchProcessor <TKey, TEntity> {
                MaxBatchSize = 16,
                ConcurrencyLevel = Math.Min(HardwareInfo.ProcessorCount, 4),
                BatchingDelayTaskFactory = cancellationToken => Task.Delay(1, cancellationToken),
                BatchProcessor = self.ProcessBatch,
            });
            _batchProcessorLazy = new Lazy <AsyncBatchProcessor <TKey, TEntity> >(
                () => BatchProcessorFactory.Invoke(this));

            using var dbContext = CreateDbContext();
            var entityType = dbContext.Model.FindEntityType(typeof(TEntity));
            var key        = entityType.FindPrimaryKey();

            KeyExtractorExpressionBuilder = options.KeyExtractorExpressionBuilder ??
                                            (eEntity => Expression.PropertyOrField(eEntity, key.Properties.Single().Name));
            var pEntity = Expression.Parameter(typeof(TEntity), "e");
            var eBody   = KeyExtractorExpressionBuilder.Invoke(pEntity);

            KeyExtractor = (Func <TEntity, TKey>)Expression.Lambda(eBody, pEntity).Compile();

            QueryTransformer = options.QueryTransformer ?? (q => q);
            PostProcessor    = options.PostProcessor ?? (_ => {});
        }
Ejemplo n.º 2
0
 public void ImportSyncAndExportFromTwoSourcesTest()
 {
     lock (TrioWing)
     {
         LoggerMock.LogRepository.Clear();
         var kernel = BatchProcessorFactory.GetKernel <CoordinatedData>();
         WaitForCompleation(kernel);
         var task  = kernel.GetConnector("EmailImporter").ExecuteConnector(ExecutionTypes.Full);
         var task1 = kernel.GetConnector("ImportFirstLastName").ExecuteConnector(ExecutionTypes.Full);
         Task.WaitAll(task, task1);
         Assert.AreNotEqual(task.Result.ProcessedItems, task1.Result.ProcessedItems);
         var task2 = kernel.GetConnector("Synchronizer").ExecuteConnector(ExecutionTypes.Full);
         task2.Wait();
         var task3 = kernel.GetConnector("Exporter").ExecuteConnector(ExecutionTypes.Full);
         task3.Wait();
         Assert.AreEqual(10, MemoryRepository.Repository.Count);
         Assert.IsNotNull(MemoryRepository.Repository.First().Value.MasterItem);
         Assert.AreEqual(10, Exporter.ExportedItems.Count);
         Assert.AreEqual(10, LoggerMock.LogRepository[task3.Result.RunId].ProcessedItems);
         Assert.AreEqual(10, LoggerMock.LogRepository[task3.Result.RunId].Progress.Count);
         Assert.AreEqual(4, kernel.GetLogger().GetLastLogItems(100, false).Count());
         Assert.AreEqual(task3.Result.ProcessedItems, kernel.GetLogger().GetLogItemHeader(task3.Result.RunId).ProcessedItems);
         Assert.AreEqual(10, kernel.GetLogger().GetProcessRecords(task3.Result.RunId, 0, false).Items.Count());
         Assert.AreEqual(0, kernel.GetLogger().GetProcessRecords(task3.Result.RunId, 0, true).Items.Count());
     }
 }
Ejemplo n.º 3
0
 public void ImportStartAndTerminate()
 {
     lock (TrioWing)
     {
         var kernel = BatchProcessorFactory.GetKernel <CoordinatedData>();
         IBatchConnector <CoordinatedData> emailConnector = null;
         try
         {
             emailConnector = kernel.GetConnector("EmailImporter");
             var task = emailConnector.ExecuteConnector(ExecutionTypes.Full);
             Thread.Sleep(50);
             kernel.TerminateAllConnectors();
             Task.WaitAll(task);
             Assert.IsFalse(kernel.GetLogger().GetLogItemHeader(task.Result.RunId).Success);
         }
         catch (AggregateException ex)
         {
             Assert.IsFalse(kernel.GetLogger().GetLogItemHeader(emailConnector.RunId).Success);
             Assert.IsInstanceOfType(ex.InnerException, typeof(InvalidAsynchronousStateException));
         }
         catch (Exception ex)
         {
             Assert.IsFalse(kernel.GetLogger().GetLogItemHeader(emailConnector.RunId).Success);
             Assert.IsInstanceOfType(ex, typeof(InvalidAsynchronousStateException));
         }
     }
 }
Ejemplo n.º 4
0
        public bool IsConnectorRunning(string name)
        {
            Initialize(string.Format("IsConnectorRunning({0})", name));
            var result = BatchProcessorFactory.GetKernel <T>().IsSynchronizerRunning(name);

            TearDown();
            return(result);
        }
Ejemplo n.º 5
0
        public IDictionary <string, ConnectorTypes> GetConnectors()
        {
            Initialize("GetConnectors");
            var result = BatchProcessorFactory.GetKernel <T>().GetConnectors();

            TearDown();
            return(result);
        }
Ejemplo n.º 6
0
 public void Initialize()
 {
     ContainerFactory.Current.KillAllInstances();
     KernelScope = Resolver.BeginKernelScope();
     Resolver.LoadModuleConfiguration <Blueprint>();
     BatchProcessorFactory.BindKernel <CoordinatedData>()
     .SetBatchRepository <MemoryRepository>()
     .SetLogger <LoggerMock>()
     .SetCoordinator <ImportFirstLastName>()
     .SetCoordinator <EmailImporter>()
     .SetCoordinator <Synchronizer>()
     .SetCoordinator <Exporter>();
 }
Ejemplo n.º 7
0
        public bool Terminate(string name)
        {
            Initialize(string.Format("Terminate({0})", name));
            bool result;

            try
            {
                result = BatchProcessorFactory.GetKernel <T>().TerminateConnector(name);
            }
            catch (Exception ex)
            {
                Tracer.SetErrorState(ex);
                Tracer.SetAdidtionalInformation("Unable to terminate connectors");
                result = false;
            }
            TearDown();
            return(result);
        }
Ejemplo n.º 8
0
        public string StartConnector(string name, ExecutionTypes executionType)
        {
            Initialize(string.Format("StartConnector({0})", name));
            IBatchConnector <T> task;

            try
            {
                task = BatchProcessorFactory.GetKernel <T>().GetConnector(name);
                task.ExecuteConnector(executionType);
            }
            catch (Exception ex)
            {
                Tracer.SetAdidtionalInformation(ex.Message);
                Tracer.SetErrorState(ex);
                throw;
            }
            TearDown();
            return(task.RunId);
        }
Ejemplo n.º 9
0
 public void ImportStartTwoImportersFailureTest()
 {
     lock (TrioWing)
     {
         IBatchConnector <CoordinatedData>         emailConnector1;
         IBatchConnector <CoordinatedData>         emailConnector2;
         Task <IBatchConnector <CoordinatedData> > task = null;
         try
         {
             var kernel = BatchProcessorFactory.GetKernel <CoordinatedData>();
             emailConnector1 = kernel.GetConnector("EmailImporter");
             task            = emailConnector1.ExecuteConnector(ExecutionTypes.Full);
             emailConnector2 = kernel.GetConnector("EmailImporter");
             var task1 = emailConnector2.ExecuteConnector(ExecutionTypes.Full);
             Task.WaitAll(task, task1);
             Assert.Fail("Should throw InvalidAsynchronousStateException");
         }
         catch (Exception ex)
         {
             Assert.IsInstanceOfType(ex, typeof(InvalidAsynchronousStateException));
         }
     }
 }
Ejemplo n.º 10
0
 private static IBatchProgressLogger GetLogger()
 {
     return(BatchProcessorFactory.GetKernel <T>().GetLogger());
 }