/// <summary> /// Identifica se um escopo precisa ser mudado e também se ele pode ser mudado /// </summary> /// <param name="opcaoEscopo"></param> /// <param name="nomeConfigConexao"></param> /// <param name="precisaMudarEscopo"></param> private void VerificarMudancaEscopo(OpcaoEscopo opcaoEscopo, string nomeConfigConexao, out bool precisaMudarEscopo) { precisaMudarEscopo = PrecisaMudarEscopo(opcaoEscopo); if (!precisaMudarEscopo) { // Se nao instanciou novo Escopo e usou o existente entao suprime finalizador GC.SuppressFinalize(this); if (_Atual != null) { if (ContextoAcessoDado.ConnectionStringSettingName != nomeConfigConexao) throw new InvalidOperationException("Para conexoes diferentes um novo escopo é necessario"); Atual.ContadorEscopo += 1; } } }
private void InicializarEscopo(OpcaoEscopo opcaoEscopo, string nomeConfigConexao, OpcaoTransacao opcaoTransacao) { // nos precisamos mudar _Atual? bool precisaMudarEscopo; VerificarMudancaEscopo(opcaoEscopo, nomeConfigConexao, out precisaMudarEscopo); //this.InicializarEscopo(opcaoEscopo, ); if (precisaMudarEscopo) { // Inicializando apenas se um novo escopo vai ser criado _ContextoAcessoDado = new ContextoAcessoDado(nomeConfigConexao); _ContextoAutenticacao = new ContextoAutenticacao(); AtribuirEscopoAtual(); // Uma transacao nunca é iniciada em um escopo que nao inciou transacional ConfigurarTransacao(opcaoTransacao); } }
/// <summary> /// Inicia um novo escopo de execução ou participa de um existente /// </summary> /// <exception cref="InvalidOperationException"><see cref="OpcaoTransacao.Requerido"/> exige <see cref="OpcaoEscopo.Requerido"/></exception> /// se um escopo ja existir sem uma transação ativa /// <param name="opcaoEscopo">Configura a forma como esse escopo vai participar de um ja existente</param> /// <param name="nomeConfigConexao">Nome da configuração de conexao em connectionStrings do arquivo de configuracao da aplicacao</param> /// <param name="opcaoTransacao">Configura a forma como esse escopo vai participar de uma transação</param> public Escopo(OpcaoEscopo opcaoEscopo, string nomeConfigConexao, OpcaoTransacao opcaoTransacao) { // Se o usuario informou explicitamente opcoes de escopo e de transacao provoca erro if (OpcaoTransacaoRequerNovoEscopo(opcaoTransacao) && opcaoEscopo == OpcaoEscopo.Requerido) throw new InvalidOperationException("Erro Transação Requer Novo Escopo"); InicializarEscopo(opcaoEscopo, nomeConfigConexao, opcaoTransacao); }
/// <summary> /// Indica se <see cref="Atual"/> precisa ser mudado para um novo escopo /// </summary> /// <param name="opcaoEscopo"></param> /// <returns>True se um novo escopo precisa ser criado para <see cref="Atual"/></returns> private static bool PrecisaMudarEscopo(OpcaoEscopo opcaoEscopo) { bool precisaMudarEscopo; switch (opcaoEscopo) { case OpcaoEscopo.Requerido: precisaMudarEscopo = (_Atual == null); break; case OpcaoEscopo.RequerNovo: precisaMudarEscopo = true; break; default: throw new ArgumentOutOfRangeException("opção"); } return precisaMudarEscopo; }
/// <summary> /// Inicia um novo escopo de execução ou participa de um existente /// </summary> /// <exception cref="InvalidOperationException"><see cref="OpcaoTransacao.Requerido"/> exige <see cref="OpcaoEscopo.Requerido"/></exception> /// se um escopo ja existir sem uma transação ativa /// <param name="opcaoEscopo">Configura a forma como esse escopo vai participar de um ja existente</param> /// <param name="opcaoTransacao">Configura a forma como esse escopo vai participar de uma transação</param> public Escopo(OpcaoEscopo opcaoEscopo, OpcaoTransacao opcaoTransacao) : this(opcaoEscopo, ContextoAcessoDado.NOME_CONEXAO_GERAL, opcaoTransacao) { }