예제 #1
0
        private static SessaoDeRequisicaoDoUsuario CreateUserSession(object httpContext, Guid identificadorDaRequisicao, DnServicoBase servico)
        {
            //Todo arrumar
            IDnObjetosTransacionais transactionObjects = null;// ITransactionObjects.Create();

            var tipoDeServico      = GetSpecializedService(servico.GetType());
            var tipo               = Setup.ConfiguracoesGlobais.TipoDeSessaoDeRequisicaoDeUsuario ?? typeof(SessaoDeRequisicaoDoUsuario);
            var sessaoDaRequisicao = Activator.CreateInstance(tipo).DnCast <SessaoDeRequisicaoDoUsuario>();

            sessaoDaRequisicao.ObjetosDaTransacao    = transactionObjects;
            sessaoDaRequisicao.IdentificadorDaSessao = identificadorDaRequisicao;
            sessaoDaRequisicao.Servicos    = new Dictionary <Type, DnServicoBase>();
            sessaoDaRequisicao.HttpContext = httpContext;

            sessaoDaRequisicao.Servicos.Add(tipoDeServico, servico);
            Setup.AdicionarSessaoDeRequisicao(sessaoDaRequisicao);

            return(sessaoDaRequisicao);
        }
예제 #2
0
        /// <summary>
        /// Cria um novo repositório.
        /// </summary>
        /// <param Nome="transactionObjects">
        /// Os objetos de controle de transação do repositório.
        /// </param>
        /// <param Nome="service">
        /// O serviço qual o repositório representa.
        /// </param>
        /// <returns>
        /// O repositório criado.
        /// </returns>
        public IDnRepositorio <T> Create <T>(IDnObjetosTransacionais transactionObjects, DnServico <T> service) where T : EntidadeBase
        {
            if (Setup.ConfiguracoesGlobais.Conexoes == null)
            {
                throw new DesenvolvimentoIncorretoException($"Arquitetura was not initialized properly");
            }

            var TipoDeBancoDeDadosAtributo = GetTheEntityTipoDeBancoDeDadosAtributo(typeof(T));

            if (TipoDeBancoDeDadosAtributo == null)
            {
                if (Setup.ConfiguracoesGlobais.Conexoes.Count == 1)
                {
                    TipoDeBancoDeDadosAtributo = Setup.ConfiguracoesGlobais.Conexoes.Single().TipoDoContexto.GetCustomAttribute <TipoDeBancoDeDadosAtributo>() ?? throw new DesenvolvimentoIncorretoException($"The entity {typeof(T).Name} needs a database type specification. Example: [TipoDeBancoDeDadosAtributo (DnTipoDeBancoDeDadosAtributo.ORACLE)]");;
                }
            }

            if (TipoDeBancoDeDadosAtributo == null)
            {
                throw new DesenvolvimentoIncorretoException($"The entity {typeof(T).Name} needs a database type specification. Example: [TipoDeBancoDeDadosAtributo (DnTipoDeBancoDeDadosAtributo.ORACLE)]");;
            }

            var localType = Setup.ConfiguracoesGlobais.TipoGenericoDeRepositorio?.MakeGenericType(typeof(T)) ?? typeof(DnEFRepository <T>);

            if (Setup.Repositorios.TryGetValue(typeof(T), out var repositoryType))
            {
                localType = repositoryType;
            }

            var repository = Create <T>(localType);

            if (transactionObjects == null)
            {
                Conexao connetion;

                if (string.IsNullOrWhiteSpace(TipoDeBancoDeDadosAtributo.Identifier))
                {
                    var conn = Setup.ConfiguracoesGlobais.Conexoes.Where(x => x.TipoDoContexto.GetCustomAttribute <TipoDeBancoDeDadosAtributo>()?.TipoDeBancoDeDados == TipoDeBancoDeDadosAtributo.TipoDeBancoDeDados);
                    if (conn.Count() > 1)
                    {
                        throw new DesenvolvimentoIncorretoException($"More than one connection of the same type was found with the same type \"{TipoDeBancoDeDadosAtributo.TipoDeBancoDeDados}\". Adicionar identifiers for them.");
                    }

                    if (conn.Count() == 0)
                    {
                        throw new DesenvolvimentoIncorretoException($"Could not find connection of requested \"{TipoDeBancoDeDadosAtributo.TipoDeBancoDeDados}\" type in entity \"{typeof(T).Name}\"");
                    }
                    connetion = conn.Single();
                }
                else
                {
                    if (Setup.ConfiguracoesGlobais.Conexoes == null)
                    {
                        throw new DesenvolvimentoIncorretoException($"Arquitetura was not initialized properly");
                    }
                    var conn = Setup.ConfiguracoesGlobais.Conexoes.Where(x =>
                                                                         x.TipoDoContexto.GetCustomAttribute <TipoDeBancoDeDadosAtributo>()?.TipoDeBancoDeDados == TipoDeBancoDeDadosAtributo.TipoDeBancoDeDados &&
                                                                         x.IdentificadorDaConexao.Equals(TipoDeBancoDeDadosAtributo.Identifier, StringComparison.InvariantCultureIgnoreCase));
                    if (conn.Count() > 1)
                    {
                        throw new DesenvolvimentoIncorretoException($"More than one connection of the same type was found with the same identifier \"{TipoDeBancoDeDadosAtributo.Identifier}\"");
                    }

                    if (conn.Count() == 0)
                    {
                        throw new DesenvolvimentoIncorretoException($"Could not find connection of requested \"{TipoDeBancoDeDadosAtributo.TipoDeBancoDeDados}\" type and identifier \"{TipoDeBancoDeDadosAtributo.Identifier}\" in entity \"{typeof(T).Name}\"");
                    }
                    connetion = conn.Single();
                }

                var transactionObjectsType = repository.TipoDeObjetosTransacionais;
                transactionObjects = FabricaDeObjetosTransacionais.Criar(transactionObjectsType, connetion, service.SessaoDaRequisicao);
                service.SessaoDaRequisicao.ObjetosDaTransacao = transactionObjects;
            }

            repository.ObjetosTransacionais = transactionObjects;
            repository.Servico = service;

            return(repository);
        }