none
Qual a vantagem de utilizar D.I RRS feed

  • Pergunta

  • Olá pessoal,

    Acabei de conseguir fazer minha primeira App usando Unity Framework para fazer D.I , e acabei vendo que o que eu já utilizava não é diferente do novo código, atualmente eu tenho uma DaoFactoy assim :

        public static class DaoFactory<T>
        {        
            public static T Create()
            {
                //instancia o objeto genérico passado como argumento
                T domainModel = Activator.CreateInstance<T>();
                return domainModel;
            }
        }
    
    Na controller este código fica assim:

            private ITipoCadastroService _iTipoCadastroService2;
            private ITipoCadastroService _iTipoCadastroService3;
            private string teste;
            public HomeController(ITipoCadastroService iTipoCadastroService2)
            {
                _iTipoCadastroService2 = iTipoCadastroService2;
                _iTipoCadastroService3 = DaoFactory<DaoTipoCadastro>.Create();
                teste = "Teste";
            }
    
    Ai que nasceu minha duvida, para mim eu estava querendo usar o Unity para economizar código, mas eu tenho de ficar registrando as DAO´s no Global.asax, não seria a mesma coisa de ficar instanciando com o DaoFactory?

    Queria saber assim por cima, se alguem conseguiu ver alguma vantagem em usar o Unity, ou se é a mesma coisa que estou fazendo atualmente..


    Obrigado

    Att.
    Leonardo Lima
    • Editado C. Augusto Proiete [MVP]Moderator quinta-feira, 11 de fevereiro de 2010 23:49 Ao abrir um tópico você já indica se trata-se de uma dúvida ou discussão. Não há a necessidade de colocar um "prefixo" no título.
    • Movido C. Augusto Proiete [MVP]Moderator quinta-feira, 11 de fevereiro de 2010 23:50 Movido para o fórum apropriado (De:ASP.NET MVC)
    terça-feira, 9 de fevereiro de 2010 16:02

Respostas

  • Fala Leonardo,

    Sugiro que você dê uma olhada nessa palestra , que fala exatamente sobre DI com o Unity.
    Você verá que "economia de código", não é, nem de longe, uma vantagem importante de se utilizar DI no seu sistema.

    A grande vantagem é minimizar o acoplamento entre os módulos do seu sistema...



    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    terça-feira, 9 de fevereiro de 2010 16:38
  • Leonardo,

    Independente do container de injeção de dependência que você usa (eu particularmente gosto do Spring.Net), a vantagem que eu percebo é minimizar o acoplamento na aplicação.

    As classes passam a conhecer as outras somente via uma interface, o que simplifica a "troca" de implementações e mocks para os casos de unit tests.

    Geralmente ajuda a evitar um pouco o "samba" de referências que geralmente acontece nos projetos...


    Abraço,

    Eric
    • Marcado como Resposta Leonardo Lima sexta-feira, 12 de fevereiro de 2010 10:14
    terça-feira, 9 de fevereiro de 2010 17:03

Todas as Respostas

  • Fala Leonardo,

    Sugiro que você dê uma olhada nessa palestra , que fala exatamente sobre DI com o Unity.
    Você verá que "economia de código", não é, nem de longe, uma vantagem importante de se utilizar DI no seu sistema.

    A grande vantagem é minimizar o acoplamento entre os módulos do seu sistema...



    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    terça-feira, 9 de fevereiro de 2010 16:38
  • Leonardo,

    Independente do container de injeção de dependência que você usa (eu particularmente gosto do Spring.Net), a vantagem que eu percebo é minimizar o acoplamento na aplicação.

    As classes passam a conhecer as outras somente via uma interface, o que simplifica a "troca" de implementações e mocks para os casos de unit tests.

    Geralmente ajuda a evitar um pouco o "samba" de referências que geralmente acontece nos projetos...


    Abraço,

    Eric
    • Marcado como Resposta Leonardo Lima sexta-feira, 12 de fevereiro de 2010 10:14
    terça-feira, 9 de fevereiro de 2010 17:03
  • Mas vc pode registrar todas as suas DAO's do projeto apenas com tres ou quatro linhas, se elas nao tiverem parametros como strings, ou algo assim. Dai elas precisam de uma linha pra cada.
    COmo foi falado com a unity vc consegue registrar as interfaces do seu projeto, e a unity instancia a classe concreta pra vc, ficando facil realizar a inversão de controle permitndo o desacoplamento da sua aplicação.
    Sem contar que é mais rapido que chamar Activator.CreateInstance toda vez.
    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 12 de fevereiro de 2010 01:15
  • Danimar, 

    Me despertou interesse sobre está citação que você fez: 

    "Mas vc pode registrar todas as suas DAO's do projeto apenas com tres ou quatro linhas, se elas nao tiverem parametros como strings, ou algo assim. Dai elas precisam de uma linha pra cada."

    Você poderia dar um exemplo? Por que fiquei com dúvida na parte "se elas não tiverem parametros como string", isto é referente à parametros no construtor da DAO? 

    Obrigado

    Att.
    Leonardo Lima
    sexta-feira, 12 de fevereiro de 2010 10:17
  • Ontem tava sem um exemplo, por isso não coloquei.
    Mas aqui esta meu registry que utilizo em meu projeto para buscar os objetos.

        Private _Container As Microsoft.Practices.Unity.UnityContainer
    
        Public Sub New()
            _Container = New Microsoft.Practices.Unity.UnityContainer()
            Inicializar()
        End Sub
    
        Private Sub Inicializar()
            'TODO Este parametro é essencial para achar o web service
            _Container.RegisterType(GetType(Repositorio.WebService.LocalServidor), New Microsoft.Practices.Unity.InjectionConstructor("localhost/FotoProduto.WebService"))
            RegistrarTipos(GetType(Repositorio.WebService.Repositoriobase).Assembly)
            'RegistrarTipos(GetType(Repositorio.SqlServer.Repositoriobase).Assembly)
    End Sub


    Private Sub RegistrarTipos(ByVal assembly As System.Reflection.Assembly)
    Dim tipos = assembly.GetTypes()

    For Each tipo In tipos
    If tipo.IsAbstract = False Then
    For Each [interface] In tipo.GetInterfaces()
    _Container.RegisterType([interface], tipo)
    Next
    End If
    Next
    End Sub

    Public Function RetornarObjeto(Of T)() As T
    Return _Container.Resolve(Of T)()
    End Function
    Essa é toda minha classe que registra e retorna todos os tipos. Todos os tipos tem no seu construtor um objeto do primeiro tipo que eu registro passando uma string no construtor.
    Eu ainda fiz uma coisa errada aqui, pois deveria ter colocado como parametro no construtor do registry o local do webservice.

    Vc pode ver no exemplo acima que tem duas linhas que chamam o metodo RegistrarTipos(), uma esta comentada,
    A primeira registra os DAO's para acessar o webservice, e a segunda para acessar diretamente o sql server, isto porque temos duas aplicações que utilizam a mesma camada de acesso a dados, mas uma é windows e dai pra ficar mais seguro nós chamamos atraves do webservice.  Apenas com uma linha trocamos a forma de acesso a dados.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 12 de fevereiro de 2010 11:11