Beispiel #1
0
        public async Task <Resultado <Digital, Falha> > IdentificarAsync(byte[] digitalNaoIdentificacada)
        {
            var contextoParaTask = new ContextoTask(_bancoDigitais.ToList(), digitalNaoIdentificacada, _motorBusca);

            _cancelamentoTask = new CancellationTokenSource();
            var token = _cancelamentoTask.Token;
            var task  = await new TaskFactory <Resultado <Digital, Falha> >().StartNew((contextoRecebido) => {
                var tempoLocalizacao = new Stopwatch();
                tempoLocalizacao.Start();
                var contexto  = contextoRecebido as ContextoTask;
                var resultado = Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "Digital não encontrada"));
                foreach (var digital in contexto.BancoDigitais)
                {
                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                    if (contexto.MotorBusca.IdentificarDigital(contexto.DigitalNaoIdentificacada, digital) is var resultadoIdentificacao && resultadoIdentificacao.EhSucesso)
                    {
                        resultado = resultadoIdentificacao.Sucesso;
                        break;
                    }
                }
                tempoLocalizacao.Stop();
                return(resultado);
            }, contextoParaTask, token);

            return(task);
        }
        public Resultado <Digital, Falha> Executar(IdentificarSocioPorDigitalComando comando)
        {
            var tempoIdentificacao = new Stopwatch();

            tempoIdentificacao.Start();

            if (_identificadoresDeDigital == null)
            {
                _identificadoresDeDigital = new ConcurrentBag <ServicoIdentificacaoDigital>();
            }
            if (_identificadoresDeDigital.Count == 0)
            {
                if (_configuracoesBiometriaRepositorio.Recuperar(comando.Estacao) is var configuracaoBiometria && configuracaoBiometria.EhFalha)
                {
                    return(configuracaoBiometria.Falha);
                }

                if (_fabricaMotorBuscaBiometrica.CriarMotorDeBuscaBiometrica(configuracaoBiometria.Sucesso.ParceiroSdkDigital) is var motorBusca && motorBusca.EhFalha)
                {
                    return(motorBusca.Falha);
                }

                if (_digitaisRepositorio.RecuperarNumeroTotalDigitais() is var quantidadeDigitais && quantidadeDigitais.EhFalha)
                {
                    return(quantidadeDigitais.Falha);
                }

                var digitaisPorPagina = (quantidadeDigitais.Sucesso / configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital) + configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital;
                for (int pagina = 1; pagina <= configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital; pagina++)
                {
                    if (_digitaisRepositorio.RecuperarPagina(pagina, digitaisPorPagina) is var digitais && digitais.EhFalha)
                    {
                        return(digitais.Falha);
                    }
                    if (digitais.Sucesso.Count() > 0)
                    {
                        _identificadoresDeDigital.Add(new ServicoIdentificacaoDigital(motorBusca.Sucesso, digitais.Sucesso));
                    }
                }
            }

            var digital = Digital.NovaNaoEncontrada();

            Parallel.ForEach(_identificadoresDeDigital, async(identificadorDigital, estadoLoop) =>
            {
                var resultado = await identificadorDigital.IdentificarAsync(comando.Template);
                if (resultado.EhSucesso)
                {
                    digital = resultado.Sucesso;
                    estadoLoop.Break();
                }
            });
            tempoIdentificacao.Stop();
            return(digital.Id == 0
                    ? Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "Digitão não encontrada"))
                    : Resultado <Digital, Falha> .NovoSucesso(digital));
        }
Beispiel #3
0
        public void Devo_Identificar_Digital_No_Banco_Quando_Informo_Template_Existente()
        {
            var digitais    = _digitaisDataAccessTestes.CarregarDigitaisParaIdentificacao().ToList();
            var digitalLida = _digitaisDataAccessTestes.CarregarDigitalEncontrada();

            digitais.Add(digitalLida);

            var resultado = Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, ""));

            var tempo = new Stopwatch();

            tempo.Start();
            foreach (var digital in digitais)
            {
                resultado = _sdk.IdentificarDigital(digitalLida.TemplateIso, digital);
                if (resultado.EhSucesso)
                {
                    break;
                }
            }
            tempo.Stop();
            Assert.IsTrue(tempo.Elapsed.TotalSeconds < 5);
            Assert.AreEqual(resultado.Sucesso.Id, digitalLida.Id);
        }