private static void CriaPropriedades(List<DadosColunas> colunas, StringBuilder retorno, IEnumerable<DadosAssociation> listaFk, List<string> enumeradores, ParametrosCriarProjetos parametros)
        {
            colunas = colunas.OrderByDescending(c => c.Pk).ToList();

            foreach (var coluna in colunas)
            {
                var colunaRequirida = false;

                if (parametros.MapLinq)
                {
                    if (coluna.Pk || coluna.AceitaNull == false)
                    {
                        retorno.AppendFormat("[Required, DisplayName(\"{0}\")]{1}", coluna.Coluna, Environment.NewLine);
                        colunaRequirida = !coluna.AceitaNull;
                    }

                    if (enumeradores != null)
                    {
                        var coluna1 = coluna;
                        foreach (var dom in enumeradores.Where(domain => coluna1.Coluna == domain.Split('|')[0]).Select(domain => string.Format("[DomainValidator(new object[]<{0}>)]{1}", domain.Split('|')[1], Environment.NewLine)).Select(prodDomain => prodDomain.Replace("<", "{").Replace(">", "}").Replace("'", "\"")))
                        {
                            retorno.Append(dom);
                        }
                    }


                    //valida o tamanho do campo de texto
                    if (coluna.Tipo.ToLower().Contains("char") || coluna.Tipo.ToLower() == "string")
                    {
                        switch (colunaRequirida)
                        {
                            case true:
                                retorno.AppendFormat("[StringLength({0})]{1}", coluna.Tamanho, Environment.NewLine);
                                break;
                            default:
                                retorno.AppendFormat("[StringLength({0}), DisplayName(\"{1}\")]{2}", coluna.Tamanho, coluna.Coluna, Environment.NewLine);
                                break;
                        }
                    }
                    //valida se o campo possui validação personalizada
                    if (!string.IsNullOrEmpty(coluna.RegExp))
                    {
                        retorno.AppendLine(string.Format("[RegularExpression(@\"{0}\")]", coluna.RegExp));
                    }
                    retorno.Append(RetornaMapColumn(coluna)).Append(Environment.NewLine);
                }

                if (parametros.MapWcf)
                {
                    retorno.AppendFormat("[DataMember]{0}", Environment.NewLine);
                }

                retorno.Append(string.Format("public {0}{1} {2} {{ get; set; }}", coluna.Tipo, VerificaNullable(coluna.Tipo, coluna.AceitaNull), RemoveCaracteresInvalidos(coluna.Coluna)) + Environment.NewLine + Environment.NewLine);
            }

            CriaAssociacoes(retorno, listaFk);

            retorno.Append("}" + Environment.NewLine);
            retorno.Append("}" + Environment.NewLine);
        }
 /// <summary>
 /// Gera os arquivos ORM (TO/DAL/BLL)
 /// </summary>
 public static void Gerar(ParametrosCriarProjetos parametros)
 {
     foreach (var objetoOrm in parametros.ObjetosMapeaveis)
     {
         GeraClassesORM(objetoOrm.Key, objetoOrm.Value, parametros);
     }
 }
        /// <summary>
        /// Gera os arquivos base para o ORM
        /// </summary>
        /// <param name="caminho">caminho para gravação dos arquivos</param>
        /// <param name="strNamespace">NameSpace usado no projeto</param>
        public static void GravaArquivosBaseOrm(ParametrosCriarProjetos parametro, string nomeProvider)
        {
            GeraArquivosLINQ(parametro, nomeProvider);
            GeraArquivosBLL(parametro.CaminhoDestino, parametro.NameSpace);
            GeraArquivosTO(parametro.CaminhoDestino);
            GeraArquivosInterface(parametro.CaminhoDestino, parametro.NameSpace);

        }
        private static void GeraClassesORM(TipoObjetoBanco objOrm, List<DadosColunas> colunasObjeto, ParametrosCriarProjetos parametros)
        {
            var gerador = new Gerador { Log = Log };
            var nomeArquivo = Gerador.RetornaNomeClasseAjustado(objOrm.NomeObjeto);

            var arquivo = gerador.GerarClasseTO(colunasObjeto, objOrm.NomeObjeto, parametros.NameSpace, objOrm.Associacoes, objOrm.Enumns, parametros);
            var arquivoBLL = gerador.GerarClasseBLL(nomeArquivo, parametros.NameSpace, objOrm.TipoObjeto, objOrm.Parametros);
            var arquivoDAL = gerador.GerarClasseDAL(nomeArquivo, parametros.NameSpace, objOrm.TipoObjeto, objOrm.Parametros, objOrm.QuerySql);

            File.WriteAllText(string.Format("{0}\\TO\\{1}TO.cs", parametros.CaminhoDestino, nomeArquivo), arquivo);
            File.WriteAllText(string.Format("{0}\\BLL\\{1}BLL.cs", parametros.CaminhoDestino, nomeArquivo), arquivoBLL);
            File.WriteAllText(string.Format("{0}\\DAL\\{1}DAL.cs", parametros.CaminhoDestino, nomeArquivo), arquivoDAL);
        }
        public static void Gerar(ParametrosCriarProjetos parametros, string provider)
        {

            var guidProjInterface = Guid.NewGuid().ToString().ToUpper();
            var guidProjTO = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjDal = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjBll = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjWcf = Guid.NewGuid().ToString().ToUpper().ToUpper();


            var arquivosInterface = (from KeyValuePair<TipoObjetoBanco, List<DadosColunas>> t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"IPersistence{0}.cs\" />", Gerador.RetornaNomeClasseAjustado(t.Key.NomeObjeto).Replace(" ", ""))).ToList();
            var arquivosTO = (from KeyValuePair<TipoObjetoBanco, List<DadosColunas>> t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}TO.cs\" />", Gerador.RetornaNomeClasseAjustado(t.Key.NomeObjeto))).ToList();
            var arquivosDal = (from KeyValuePair<TipoObjetoBanco, List<DadosColunas>> t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}DAL.cs\" />", Gerador.RetornaNomeClasseAjustado(t.Key.NomeObjeto))).ToList();
            var arquivosBll = (from KeyValuePair<TipoObjetoBanco, List<DadosColunas>> t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}BLL.cs\" />", Gerador.RetornaNomeClasseAjustado(t.Key.NomeObjeto))).ToList();

            var sbLog4Net = new StringBuilder();

            sbLog4Net.AppendLine("<Reference Include=\"log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=AMD64\">");
            sbLog4Net.AppendLine("<SpecificVersion>False</SpecificVersion>");
            sbLog4Net.AppendLine("<HintPath>..\\log4net.dll</HintPath>");
            sbLog4Net.AppendLine("</Reference>");

            var templateAssembly = AssinaProjeto(parametros);

            GeraProjetoInterface(parametros, guidProjInterface, arquivosInterface, templateAssembly);
            GeraProjetoTo(parametros, guidProjTO, guidProjInterface, arquivosTO, templateAssembly);
            GeraProjetoDal(parametros, provider, guidProjDal, guidProjInterface, guidProjTO, arquivosDal, sbLog4Net, templateAssembly);
            GeraProjetoBll(parametros, guidProjBll, guidProjInterface, guidProjTO, guidProjDal, arquivosBll, sbLog4Net, templateAssembly);
            
            if (parametros.MapWcf)
            {
                GeraProjetoWcf(parametros, guidProjWcf);
            }
            else
            {
                guidProjWcf = null;
            }
            
            GeraSoluction(parametros, guidProjTO, guidProjDal, guidProjInterface, guidProjBll, guidProjWcf);

            Directory.Move(string.Format("{0}\\TO", parametros.CaminhoDestino), string.Format("{0}\\{1}TO", parametros.CaminhoDestino, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\DAL", parametros.CaminhoDestino), string.Format("{0}\\{1}DAL", parametros.CaminhoDestino, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\BLL", parametros.CaminhoDestino), string.Format("{0}\\{1}BLL", parametros.CaminhoDestino, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\Interfaces", parametros.CaminhoDestino), string.Format("{0}\\{1}Interfaces", parametros.CaminhoDestino, parametros.NameSpace.Replace(".", "")));

        }
        public static void Gerar(ParametrosCriarProjetos parametros)
        {
            if (!parametros.GerarAppConfig) return;

            var sbAppConfig = new StringBuilder();

            sbAppConfig.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
            sbAppConfig.AppendLine("<configuration>");
            sbAppConfig.AppendLine("<connectionStrings>");
            sbAppConfig.AppendLine(string.Format("<add name=\"STRING_CONNECTION\" connectionString=\"Data Source = {0}; Initial Catalog = {2}; " +
                                                 "Persist Security Info = True; User ID = {1}; Password = {3}; " +
                                                 "\" providerName=\"System.Data.SqlClient\" />", parametros.DadosConexao.Servidor, 
                                                 parametros.DadosConexao.Usuario, parametros.DadosConexao.DataBase, parametros.DadosConexao.Senha));
            sbAppConfig.AppendLine("</connectionStrings>");
            sbAppConfig.AppendLine("</configuration>");

            File.WriteAllText(string.Format("{0}\\app.config", parametros.CaminhoDestino), sbAppConfig.ToString());
        }
        private static void GeraSoluction(ParametrosCriarProjetos parametros, string guidProjTO, string guidProjDAL, string guidProjInterface, string guidProjBLL, string guidProjWcf)
        {
            var trocasSolution = new Hashtable
            {
                {"[guid]", Guid.NewGuid().ToString().ToUpper().ToUpper()},
                {"[namespace]", parametros.NameSpace},
                {"[guidTO]", guidProjTO},
                {"[guidDAL]", guidProjDAL},
                {"[guidInterface]", guidProjInterface},
                {"[guidBLL]", guidProjBLL}
            };

            var projSolution = Gerador.RetornaTextoBase("noituloS");

            if (parametros.MapWcf)
            {
                projSolution = projSolution.Replace("[guidWcf]", string.Format("Project(\"{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}\") = \"{0}Wcf\", \"{0}Wcf\\{0}Wcf.csproj\", \"{{53034ACE-081D-4CDA-8075-D3B158C7DAF9}}\"{1}EndProject", parametros.NameSpace, Environment.NewLine));
                projSolution = projSolution.Replace("[guidGlobalWcf]", string.Format("{{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{1}{{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU{1}{{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU{1}{{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU", guidProjWcf, Environment.NewLine));
            }
            else
            {
                projSolution = projSolution.Replace("[guidWcf]", "");
                projSolution = projSolution.Replace("[guidGlobalWcf]", "");
            }

            switch (parametros.VersaoFramework)
            {
                case "v2.0":
                    projSolution = projSolution.Replace("2010", "2008");
                    projSolution = projSolution.Replace("11.00", "10.00");
                    break;
                case "v4.5":
                    projSolution = projSolution.Replace("2010", "2012");
                    projSolution = projSolution.Replace("11.00", "12.00");
                    break;
            }

            projSolution = trocasSolution.Cast<DictionaryEntry>().Aggregate(projSolution, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));

            File.WriteAllText(string.Format("{0}\\{1}.sln", parametros.CaminhoDestino, parametros.NameSpace), projSolution);
        }
        /// <summary>
        /// Cria o TO da tabela selecionada
        /// </summary>
        /// <param name="colunas">Colunas usadas no TO</param>
        /// <param name="nomeTabela">nome da classe TO</param>
        /// <param name="strNamespace">Namespace do Projeto</param>
        /// <param name="listaFk">lista de FK do objeto FK </param>
        /// <param name="enumeradores">Lista de Enuns do bando de dados </param>
        /// <param name="parametros"></param>
        /// <returns></returns>
        public string GerarClasseTO(List<DadosColunas> colunas, string nomeTabela, string strNamespace, List<DadosAssociation> listaFk, List<string> enumeradores, ParametrosCriarProjetos parametros)
        {
            var retorno = new StringBuilder();

            CriaCabecario(nomeTabela, strNamespace, retorno, parametros);

            CriaEnumeradores(enumeradores, retorno);

            CriaPropriedades(colunas, retorno, listaFk, enumeradores, parametros);

            return retorno.ToString();
        }
        private static void CriaCabecario(string nomeTabela, string strNamespace, StringBuilder retorno, ParametrosCriarProjetos parametros)
        {
            retorno.AppendFormat("using System;{0}", Environment.NewLine);

            if (parametros.MapLinq)
            {
                retorno.AppendFormat("using System.ComponentModel;{0}", Environment.NewLine);
                retorno.AppendFormat("using System.ComponentModel.DataAnnotations;{0}", Environment.NewLine);
                retorno.AppendFormat("using System.Data.Linq.Mapping;{0}", Environment.NewLine);
            }
            if (parametros.MapWcf)
            {
                retorno.AppendFormat("using System.Runtime.Serialization;{0}", Environment.NewLine);
            }

            retorno.AppendLine();
            retorno.AppendFormat("{0}{1}", string.Format("namespace {0}TO", strNamespace), Environment.NewLine);
            retorno.AppendFormat("{{{0}", Environment.NewLine);

            if (parametros.MapLinq)
            {
                retorno.AppendFormat("{0}{1}", string.Format("[Table(Name = \"{0}\")]", nomeTabela), Environment.NewLine);
            }
            if (parametros.MapWcf)
            {
                retorno.AppendFormat("{0}{1}", "[DataContract]", Environment.NewLine);
            }

            retorno.AppendFormat("{0}{1}", string.Format("public class {0}TO", RetornaNomeClasseAjustado(nomeTabela)), Environment.NewLine);
            retorno.AppendFormat("{{{0}{0}", Environment.NewLine);
        }
 /// <summary>
 /// Cria todos os arquivos de mapeamento
 /// </summary>
 /// <param name="parametros"></param>
 public void CriarArquivosProjeto(ParametrosCriarProjetos parametros)
 {
     DiretoriosBase.Criar(parametros.CaminhoDestino);
     ArquivosORM.GravaArquivosBaseOrm(parametros, "MySqlFormatter");
     ArquivosObjetos.Gerar(parametros);
     ArquivosProjeto.Gerar(parametros, "MySqlFormatter");
     ArquivoAppConfig.Gerar(parametros);
 }
        private static void GeraArquivosLINQ(ParametrosCriarProjetos parametro, string nomeProvider)
        {

            // ReSharper disable ResourceItemNotResolved
            var dbExpressions = Template.RetornaValor("DbExpressions").Value;
            var dbExpressionVisitor = Template.RetornaValor("DbExpressionVisitor").Value;
            var expressionVisitor = Template.RetornaValor("ExpressionVisitor").Value;
            var queryExecutor = Template.RetornaValor("QueryExecutor").Value;
            var queryLanguage = Template.RetornaValor("QueryLanguage").Value;
            var queryMapping = Template.RetornaValor("QueryMapping").Value;
            var queryTypeSystem = Template.RetornaValor("QueryTypeSystem").Value;
            var sqlFormatter = Template.RetornaValor("SqlFormatter").Value;

            var ISqlFormatter = Template.RetornaValor("ISqlFormatter").Value;
            var provider = Template.RetornaValor(nomeProvider).Value;

            string funcoesCrud;

            if (nomeProvider.StartsWith("MySql"))
            {
                funcoesCrud = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("FuncoesCrud").Value, (current, param) => current.Replace(param.Key, param.Value)).Replace("{namespace}",parametro.NameSpace);
            }
            else
            {
                funcoesCrud = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("SSFuncoesCrud").Value, (current, param) => current.Replace(param.Key, param.Value)).Replace("{namespace}", parametro.NameSpace);
            }

            var sqlLanguage = Template.RetornaValor("SqlLanguage").Value;

            var crudBase = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("CrudBase").Value, (current, param) => current.Replace(param.Key, param.Value));
            var singleton = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("Singleton").Value, (current, param) => current.Replace(param.Key, param.Value));

            var eTipoConsulta = Template.RetornaValor("ETipoConsulta").Value;
            var cmdMap = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("CmdMap").Value, (current, param) => current.Replace(param.Key, param.Value));
            var transaction = parametro.TiposObjetosAcaoBanco.Aggregate(Template.RetornaValor("Transaction").Value, (current, param) => current.Replace(param.Key, param.Value));

            var fastInvoke = Template.RetornaValor("FastInvoke").Value;
            var mapExtension = Template.RetornaValor("MapExtension").Value;
            var cachingMannager = Template.RetornaValor("CachingMannager").Value;
            var eCacheAcao = Template.RetornaValor("ECacheAcao").Value;
            var cacheChangedEventArgs = Template.RetornaValor("CacheChangedEventArgs").Value;
            var cacheChangedEventHandler = Template.RetornaValor("CacheChangedEventHandler").Value;
            var cachingProvider = Template.RetornaValor("ICachingProvider").Value;


            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\DbExpressions.cs", parametro.CaminhoDestino), dbExpressions);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\DbExpressionVisitor.cs", parametro.CaminhoDestino), dbExpressionVisitor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\ExpressionVisitor.cs", parametro.CaminhoDestino), expressionVisitor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryExecutor.cs", parametro.CaminhoDestino), queryExecutor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryLanguage.cs", parametro.CaminhoDestino), queryLanguage);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryMapping.cs", parametro.CaminhoDestino), queryMapping);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryTypeSystem.cs", parametro.CaminhoDestino), queryTypeSystem);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\SqlFormatter.cs", parametro.CaminhoDestino), sqlFormatter);

            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\FastInvoke.cs", parametro.CaminhoDestino), fastInvoke);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\MapExtension.cs", parametro.CaminhoDestino), mapExtension);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\CachingMannager.cs", parametro.CaminhoDestino), cachingMannager);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Enuns\\ECacheAcao.cs", parametro.CaminhoDestino), eCacheAcao);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Events\\CacheChangedEventArgs.cs", parametro.CaminhoDestino), cacheChangedEventArgs);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Events\\CacheChangedEventHandler.cs", parametro.CaminhoDestino), cacheChangedEventHandler);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Interfaces\\ICachingProvider.cs", parametro.CaminhoDestino), cachingProvider);



            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\Factories\\ISqlFormatter.cs", parametro.CaminhoDestino), ISqlFormatter.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\Factories\\{1}.cs", parametro.CaminhoDestino, nomeProvider), provider.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));

            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\FuncoesCrud.cs", parametro.CaminhoDestino), funcoesCrud.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\SqlLanguage.cs", parametro.CaminhoDestino), sqlLanguage.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));

            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Base\\CrudBase.cs", parametro.CaminhoDestino), crudBase.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)).Replace("{namespace}", parametro.NameSpace));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Conexao\\Singleton.cs", parametro.CaminhoDestino), singleton.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Enumeradores\\ETipoConsulta.cs", parametro.CaminhoDestino), eTipoConsulta.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\CommandMap\\CmdMap.cs", parametro.CaminhoDestino), cmdMap);
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\CommandMap\\Transaction.cs", parametro.CaminhoDestino), transaction);

        }
        private static string AssinaProjeto(ParametrosCriarProjetos parametros)
        {
            var templateAssembly = Gerador.RetornaTextoBase("ofnIylbmessA");
            var tmpAssInfo = string.Empty;

            if (parametros.AssinarProjeto)
            {
                if (string.IsNullOrEmpty(parametros.CaminhoStrongName))
                {
                    var nomeSnkFile = string.Format("{0}.snk", parametros.NameSpace);

                    GerarKey(string.Format("{0}\\{1}", parametros.CaminhoDestino, nomeSnkFile));
                    tmpAssInfo = string.Format("[assembly: AssemblyKeyFile({0}\"{1}{2}\")]", "@", "..\\", nomeSnkFile);
                }
                else
                {
                    tmpAssInfo = string.Format("[assembly: AssemblyKeyFile({0}\"{1}\")]", "@", parametros.CaminhoStrongName);
                }
            }

            templateAssembly = templateAssembly.Replace("{sing}", tmpAssInfo);
            return templateAssembly;
        }
        private static void GeraProjetoWcf(ParametrosCriarProjetos parametros, string guidProjWcf)
        {
            var servicos = new List<string>();
            var servicosCode = new List<string>();
            var servicosInterface = new List<string>();

            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\", parametros.CaminhoDestino, parametros.NameSpace));
            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\Interface", parametros.CaminhoDestino, parametros.NameSpace));
            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\Properties", parametros.CaminhoDestino, parametros.NameSpace));

            var assemblyInfoWcf = Gerador.RetornaTextoBase("AssemblyInfoWcf").Replace("{namespace}", parametros.NameSpace).Replace("{guid}", Guid.NewGuid().ToString("D"));
            File.WriteAllText(string.Format("{0}\\{1}Wcf\\Properties\\AssemblyInfo.cs", parametros.CaminhoDestino, parametros.NameSpace), assemblyInfoWcf);

            foreach (var classe in parametros.ObjetosMapeaveis)
            {
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}.cs", parametros.CaminhoDestino, parametros.NameSpace, classe.Key.NomeObjeto), string.Format("<%@ ServiceHost Language=\"C#\" Debug=\"true\" Service=\"CorpWcf.Aceite\" CodeBehind=\"{0}.svc.cs\" %>", classe.Key.NomeObjeto));

                var corpoServico = Gerador.RetornaTextoBase("corpoServico").Replace("{namespace}", parametros.NameSpace).Replace("{classe}", classe.Key.NomeObjeto);
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}.svc.cs", parametros.CaminhoDestino, parametros.NameSpace, classe.Key.NomeObjeto), corpoServico);

                var corpoInterfaceServico = Gerador.RetornaTextoBase("corpoInterfaceServico").Replace("{namespace}", parametros.NameSpace).Replace("{classe}", classe.Key.NomeObjeto); ;
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\Interface\\I{2}.cs", parametros.CaminhoDestino, parametros.NameSpace, classe.Key.NomeObjeto), corpoInterfaceServico);

                servicos.Add(string.Format("<Content Include=\"{0}.svc\" />", classe.Key.NomeObjeto));
                servicosCode.Add(string.Format("<Compile Include=\"{0}.svc.cs\">{1}<DependentUpon>{0}.svc</DependentUpon>{1}</Compile>", classe.Key.NomeObjeto, Environment.NewLine));
                servicosInterface.Add(string.Format("<Compile Include=\"Interface\\I{0}.cs\" />", classe.Key.NomeObjeto));
            }

            var corpoProjetoWcf = Gerador.RetornaTextoBase("corpoProjetoWcf").Replace("{namespace}", parametros.NameSpace)
                .Replace("{servicos}", string.Join("\n", servicos))
                .Replace("{servicosCode}", string.Join("\n", servicosCode))
                .Replace("[guid]", guidProjWcf)
                .Replace("{servicosInterface}", string.Join("\n", servicosInterface));

            File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}Wcf.csproj", parametros.CaminhoDestino, parametros.NameSpace, parametros.NameSpace), corpoProjetoWcf);

            var corpoWebConfig = Gerador.RetornaTextoBase("corpoWebConfig");
            File.WriteAllText(string.Format("{0}\\{1}Wcf\\Web.config", parametros.CaminhoDestino, parametros.NameSpace), corpoWebConfig);

        }
        private static void GeraProjetoInterface(ParametrosCriarProjetos parametros, string guidProjInterface, List<string> arquivosInterface, string templateAssembly)
        {
            var trocasInterface = new Hashtable
            {
                {"[guid]", guidProjInterface},
                {"[namespace]", parametros.NameSpace},
                {"[arquivos]", string.Join("\n", arquivosInterface.ToArray())}
            };

            var projInterface = Gerador.RetornaTextoBase("secafretnIetalpmeT");
            projInterface = trocasInterface.Cast<DictionaryEntry>().Aggregate(projInterface, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projInterface = projInterface.Replace("[versao]", parametros.VersaoFramework);

            var assemblyInterface = templateAssembly.Replace("[log]", "");
            assemblyInterface = assemblyInterface.Replace("[namespace]", parametros.NameSpace);
            assemblyInterface = assemblyInterface.Replace("[guid]", guidProjInterface);

            File.WriteAllText(string.Format("{0}\\Interfaces\\{1}Interfaces.csproj", parametros.CaminhoDestino, parametros.NameSpace), projInterface);
            File.WriteAllText(string.Format("{0}\\Interfaces\\Properties\\AssemblyInfo.cs", parametros.CaminhoDestino), assemblyInterface);
        }
        private static void GeraProjetoDal(ParametrosCriarProjetos parametros, string provider, string guidProjDAL, string guidProjInterface, string guidProjTO, List<string> arquivosDAL, StringBuilder sbLog4Net, string templateAssembly)
        {
            var trocasDAL = new Hashtable
            {
                {"[guid]", guidProjDAL},
                {"[namespace]", parametros.NameSpace},
                {"[guidInterface]", guidProjInterface},
                {"[guidTO]", guidProjTO},
                {"[provider]", string.Format("<Compile Include=\"DataDrain\\Factories\\{0}.cs\" />", provider)},
                {"[arquivos]", string.Join("\n", arquivosDAL.ToArray())},
            };

            var projDAL = Gerador.RetornaTextoBase("SSLADetalpmet").Replace("[log]", "");

            projDAL = trocasDAL.Cast<DictionaryEntry>().Aggregate(projDAL, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projDAL = projDAL.Replace("[versao]", parametros.VersaoFramework);


            var assemblyDAL = templateAssembly.Replace("[camada]", "DAL").Replace("[log]", "");
            
            assemblyDAL = assemblyDAL.Replace("[namespace]", parametros.NameSpace);
            assemblyDAL = assemblyDAL.Replace("[guid]", guidProjDAL);


            File.WriteAllText(string.Format("{0}\\DAL\\{1}DAL.csproj", parametros.CaminhoDestino, parametros.NameSpace), projDAL);
            File.WriteAllText(string.Format("{0}\\DAL\\Properties\\AssemblyInfo.cs", parametros.CaminhoDestino), assemblyDAL);
        }
        private static void GeraProjetoBll(ParametrosCriarProjetos parametros, string guidProjBLL, string guidProjInterface, string guidProjTO, string guidProjDAL, List<string> arquivosBLL, StringBuilder sbLog4Net, string templateAssembly)
        {
            var trocasBLL = new Hashtable
            {
                {"[guid]", guidProjBLL},
                {"[namespace]", parametros.NameSpace},
                {"[guidInterface]", guidProjInterface},
                {"[guidTO]", guidProjTO},
                {"[guidDAL]", guidProjDAL},
                {"[arquivos]", string.Join("\n", arquivosBLL.ToArray())},
            };

            var projBLL = Gerador.RetornaTextoBase("LLBetalpmet").Replace("[log]", "");
            projBLL = trocasBLL.Cast<DictionaryEntry>().Aggregate(projBLL, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projBLL = projBLL.Replace("[versao]", parametros.VersaoFramework);

            var assemblyBLL = templateAssembly.Replace("[camada]", "bll").Replace("[log]", "");
            assemblyBLL = assemblyBLL.Replace("[namespace]", parametros.NameSpace);
            assemblyBLL = assemblyBLL.Replace("[guid]", guidProjBLL);


            File.WriteAllText(string.Format("{0}\\BLL\\{1}BLL.csproj", parametros.CaminhoDestino, parametros.NameSpace), projBLL);
            File.WriteAllText(string.Format("{0}\\BLL\\Properties\\AssemblyInfo.cs", parametros.CaminhoDestino), assemblyBLL);
        }