none
C# - Injeção de Dependência (Simple Injector) - Lentidão RRS feed

  • Pergunta

  • Pessoal, estou desenvolvendo uma aplicação Windows Forms e estou utilizando o Simple Injector, pois ele é muito simples de se implementar. Tenho um form MDI que será o container para muitas janelas filhas.

    O Problema é que quando chamo a janela filha, está ocorrendo um delay de uns 8 segundos + ou -. Depois isso ele abre a janela e carrega o grid normalmente... Estou achando meio fora do normal demorar tanto assim.

    O que vocês acham que pode ser?

    //Form Menu Principal
    public partial class frmMenuPrincipal : Form
        {
            private static SimpleInjector.Container container;
            public frmMenuPrincipal()
            {            
                InitializeComponent();
            }
    
            private void testeToolStripMenuItem_Click(object sender, EventArgs e)
            {
                
                frmClientePrincipal fr = container.GetInstance<frmClientePrincipal>();
                fr.MdiParent = this;
                fr.Show();
            }
    public static class SimpleInjectorContainer
        {
            public static Container RegistrarServicos()
            {
                var container = new Container();
    
                container.Register(typeof(IAplServicoBase<>), typeof(AplServicoBase<>));
                container.Register<IPessoaTipoAplServico, PessoaTipoAplServico>();
                container.Register<IClienteAplServico, ClienteAplServico>();
    
                container.Register(typeof(IServicoBase<>), typeof(ServicoBase<>));
                container.Register<IPessoaTipoServico, PessoaTipoServico>();
                container.Register<IClienteServico, ClienteServico>();
    
                container.Register(typeof(IRepositorioBase<>), typeof(RepositorioBase<>));
                container.Register<IClienteRepositorio, ClienteRepositorio>();
    
    
                //container.Verify();
                return container;
            }        
        }



    segunda-feira, 6 de março de 2017 15:49

Respostas

  • Então, já vi isso acontecer quando se utiliza o code first. No primeiro acesso ao banco o EF faz a conferencia para ver se o modelo de classes está igual ao banco e ai demora. Tenta mudar essa parte para ver se melhora a performance.


    quarta-feira, 8 de março de 2017 12:04

Todas as Respostas

  • Olá Jalber tudo bem?

    Posso te perguntar o que tem no load do formulário filho? Eu uso simple injector e nunca tive problemas de lentidão, não acho que seja o injetor de dependência...

    segunda-feira, 6 de março de 2017 16:44
  • Olá Pablo. 

    No evento Load fo form, eu chamo uma função para montar um DataGridView e em seguida, eu carrego-o com os dados.

    Eu fiz o teste de carregamento apenas do DataGridView e a lentidão não ocorreu. O problema acontece quando eu executo a aplicação pela primeira vez... Fica lento para ele chamar o método GetAll().... Tenho dois GetAll: Um que eu passo Predicate para filtrar e outro GetAll que me retorna todos os registros sem filtro. Nos dois casos, acontece a lentidão.

    Vc gostaria de olhar o Projeto?

    segunda-feira, 6 de março de 2017 17:01
  • Acredito que esteja implementando errado, melhor você seguir o as recomendações dos responsaveis pela ferramenta.

    Pelo que estou vendo no seu código, você está criando várias instancias que como consequência cria novos binds, pode ser isso que deixe lento.

    Segue o tutorial abaixo, é simples de implementar.

    http://simpleinjector.readthedocs.io/en/latest/windowsformsintegration.html

    segunda-feira, 6 de março de 2017 17:44
  • Olá Cesar.

    O Problema é que minha app possui diversos repositórios e Interfaces... Segui umas dicas em umas vídeo aulas do André Pires, conhece? O Projeto segue os conceitos DDD com as camadas Domain, Infra, Aplication e Presentation....

    segunda-feira, 6 de março de 2017 21:53
  • Até ai tudo bem, você só vai criar um repositório de injeção de pendências e distribuir para o projeto inteiro. Segue o tutorial e centraliza as configurações.
    terça-feira, 7 de março de 2017 14:33
  • A lentidão acontece só na primeira vez que acessa a tela?
    terça-feira, 7 de março de 2017 17:20
  • Isso mesmo Pablo. Estava conversando com um programador ontem e ele olhou remotamente meu código. Ele disse que o EntityFRamework está causando a lentidão. Não sabia disso... Estava tão animado com ele kkkkkk.

    Ele disse que muitos programadores fazem toda parte do Select com um framework chamado DAPPER... Já os Inserts e Updates eles deixam com o EntityFramework....

    terça-feira, 7 de março de 2017 22:25
  • Então, já vi isso acontecer quando se utiliza o code first. No primeiro acesso ao banco o EF faz a conferencia para ver se o modelo de classes está igual ao banco e ai demora. Tenta mudar essa parte para ver se melhora a performance.


    quarta-feira, 8 de março de 2017 12:04
  • Jalber, 

    Você conseguiu resolver o problema de lentidão? Se sim, poderia compartilhar como?

    Outra coisa você consegue chamar um outro formulário passando itens como parâmetro, tipo passar um Id de um produto?

    As interfaces eu consigo utilizar o SimpleInjector normalmente, mas tem formulários que no construtor preciso passar  o ID do produto.

    quarta-feira, 17 de maio de 2017 18:01
  • Olá XBral, resolvi... Só não implementei ainda.

    Me disseram que o EF 6 é lento para fazer selects... Ainda mais com joins... é uma carroça. Dizem que o EF Core é mais rápido, mas ainda não tive tempo de testar, pois estou quebrando a cabeça em montar um projeto seguindo as boas práticas do DDD... Enfim, a solução seria usar um framework chamado Dapper! VC cria um repositório(CRUD) idêntico ao do Entitiy framework, só que vc monta seus selects nele... a parte de gravar, atualizar e excluir ficaria a cargo do EF e a parte dos selects ficaria a cargo do  Dapper... Pesquise sobre como montar um repositório com ele...

    Sobre sua pergunta "Outra coisa você consegue chamar um outro formulário passando itens como parâmetro, tipo passar um Id de um produto?":

    Não sei se entendi muito bem, mas se for o que estou pensando, consigo normalmente. No meu caso, eu carrego um DataGridView em um form. Quando eu dou dois cliques em uma linha do mesmo, ele carrega as classes, chama o outro form e pelo construtor passo as classes normalmente....

    quarta-feira, 17 de maio de 2017 22:12
  • Jalber Romano,

    Também estou seguindo as dicas do André Pires e tentando montar uma aplicação Windows Forms estruturada nos conceitos DDD.

    Estou com problemas na implementação do SimpleInjector. Já li a documentação no site deles e ainda não consegui implementar e usar de fato nos meus Form's.

    Você poderia me dar uma mão ou disponibilizar os trechos de código que vc tem sobre isso?

    Obrigado.

    quarta-feira, 30 de agosto de 2017 13:34
  • Olá BrunooF.

    Eu consegui fazer uma vez, mas o projeto estava mal estruturado e acabei abandonando-o. O curso do André Pires é muito bom, só que é mais focado para aplicação web. Se vc for criar uma app para desktop, tem algumas coisas que precisam ser removidas... E para quem está iniciando é tenso... Estou usando o Ninject, mas me disseram que é meio lento... Futuramente irei tentar mudar para o SimpleInjector novamente, mas será necessário mudar minha camada Ioc.... Não tenho muito tempo, pois estou estudando wpf que vc pode construir telas mais ricas em relação ao windows forms... Se vc tiver skype, me add para irmos trocando uma ideia sobre o tema... Uma vai ajudando o outro...  skype: jalber.romano

    Abraço!

    quarta-feira, 30 de agosto de 2017 23:44