DI con Windsor y parametros en el constructor

71 views
Skip to first unread message

Rodrigo Juarez

unread,
Jun 17, 2011, 10:34:36 AM6/17/11
to AltNet-Hispano
Hola a todos

1) Tengo una clase que recibe un parametro en su constructor (el
nombre de un archivo sobre el que va a trabajar)

public class MiLectorDeArchivo {

public MiLectorDeArchivo(string fileName)
{
_fileName = fileName;
Init(_fileName);
}
.
.
.

¿Si estoy utilizando Windsor y el ServiceLocator de Microsoft, como
hago para obtener una instancia de dicha clase? ¿Es decir en el
ServiceLocator.Current.GetInstance<MiLectorDeArchivo>() como le paso
el valor de fileName?
¿Y si no estoy usando el service locator y en otra clase tengo una
dependencia en el constructor a MiLectorDeArchivo, como hago para que
la resuelva Windsor?

2) ¿Teniendo en cuenta el punto anterior y OOP, esta mal que pase el
nombre de archivo en el constructor? ¿Seria recomendable utilizar un
metodo de inicializacion que es llamado en forma posterior a la
creacion? A mi me resulta mas claro pasar el parametro en el
constructor, porque estoy indicando la obligatoriedad del mismo.

Desde ya, muchas gracias por sus comentarios

Mauricio Scheffer

unread,
Jun 17, 2011, 10:45:55 AM6/17/11
to altnet-...@googlegroups.com
Hola Rodrigo,

1. Parafraseando a Martin Fowler: Primera regla de ServiceLocator: no uses ServiceLocator.
2. En general, lo que ponés en el constructor (que es parte de las dependencias de tu componente) lo definís en "tiempo de registración", no en "tiempo de resolución". Si tenés que variar el nombre del archivo en tiempo de resolución, probablemente querés ponerlo como parámetro de un método de tu componente.

Saludos,
Mauricio


2011/6/17 Rodrigo Juarez <rodrigo...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a altnet-hispan...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/altnet-hispano?hl=es.


Carlos Peix

unread,
Jun 17, 2011, 10:57:42 AM6/17/11
to altnet-...@googlegroups.com
Hola Rodrigo,

Creo que es preferible, en este caso, que el lector reciba el nombre en el constructor y que no metas ese componente en Windsor.

En vez de hacer un new del lector podrías hacer un factor method para crearlo y sobreescribirlo en subclases para probar.

Carlos Peix
(desde el teléfono móvil)

José F. Romaniello

unread,
Jun 17, 2011, 4:40:11 PM6/17/11
to altnet-...@googlegroups.com
Yo escribí acerca de otra forma aca:
ese subdependency resolver te deja poner los parametros en el webconfig por ejemplo...Sería para el caso que dijo de Mauricio de usarlo en tiempo de registración

Uso algo similar a eso en algunas aplicaciones.

Rodrigo Juarez

unread,
Jun 17, 2011, 11:47:10 PM6/17/11
to AltNet-Hispano
Gracias a todos por las respuestas ...

Mauricio, parafraseando al Chapulin Colorado: "Lo sospeche desde un
principio"

Carlos, podrias desarrollar un poco lo del factor(y) method? Dejaria
de ser una clase "inyectable"?

Jose, gracias por el enlace, igual en estos momentos lo tengo que
resolver en tiempo de "resolucion"

Ahora, que lo que yo quiera hacer no sea facilmente realizable con
windsor (¿o pasa con otras herramientas de inyeccion tambien?) es un
"smell" en mi codigo o un problema de DI?

Saludos!!

On Jun 17, 11:45 am, Mauricio Scheffer <mauricioschef...@gmail.com>
wrote:
> Hola Rodrigo,
>
> 1. Parafraseando a Martin Fowler<http://martinfowler.com/bliki/FirstLaw.html>:
> Primera regla de ServiceLocator: no uses ServiceLocator.
> 2. En general, lo que ponés en el constructor (que es parte de las
> dependencias de tu componente) lo definís en "tiempo de registración", no en
> "tiempo de resolución". Si tenés que variar el nombre del archivo en tiempo
> de resolución, probablemente querés ponerlo como parámetro de un método de
> tu componente.
>
> Saludos,
> Mauricio
>
> 2011/6/17 Rodrigo Juarez <rodrigomjua...@gmail.com>
> >http://groups.google.com/group/altnet-hispano?hl=es.- Hide quoted text -
>
> - Show quoted text -

Carlos Peix

unread,
Jun 18, 2011, 5:55:32 AM6/18/11
to altnet-...@googlegroups.com

2011/6/18 Rodrigo Juarez <rodrigo...@gmail.com>

Carlos, podrias desarrollar un poco lo del factor(y) method? Dejaria
de ser una clase "inyectable"?

public class Lector : ILector, IDisposable
{
    public Lector(string fileName) // o mejor (FileInfo file)
    {
    }
}

public class ClaseQueNecesitaElLector
{
    public void MetodoQueNecesitaElLector()
    {
        using (var lector = CrearLector("archivo.txt"))
        {}
    }

    public virtual ILector CrearLector(string fileName)
    {
        return new Lector(fileName);
    }
}

Cuando queres probar la ClaseQueNecesitaElLector simplemente haces una subclase, un override del metodo CrearLector y ese metodo devuelve un lector simulado.

Ahora, que lo que yo quiera hacer no sea facilmente realizable con
windsor (¿o pasa con otras herramientas de inyeccion tambien?) es un
"smell" en mi codigo o un problema de DI?

El unico smell que veo es si el lector no recibe el archivo en el constructor. En este caso veo un conflicto entre dos tecnicas, tenes que decidir cual descartas y resolver el testing de otra manera (porque uno de los motivos por los cuales pasar las dependencias en el constructor es facilitar el testing).

Abrazo

-------------------------------
Carlos Peix

Rodrigo Juarez

unread,
Jun 20, 2011, 10:59:45 PM6/20/11
to AltNet-Hispano
Gracias Carlos, me vino muy bien el codigo y el comentario para pensar
sobre el tema

Saludos!!

On Jun 18, 6:55 am, Carlos Peix <carlos.p...@gmail.com> wrote:
> 2011/6/18 Rodrigo Juarez <rodrigomjua...@gmail.com>
>
> > Carlos, podrias desarrollar un poco lo del factor(y) method? Dejaria
> > de ser una clase "inyectable"?
>
> public class Lector : ILector, IDisposable
> {
>     public Lector(string fileName) // o mejor (FileInfo file)
>     {
>     }
>
> }
>
> public class ClaseQueNecesitaElLector
> {
>     public void MetodoQueNecesitaElLector()
>     {
>         using (var lector = CrearLector("archivo.txt"))
>         {}
>     }
>
>     public *virtual* ILector CrearLector(string fileName)
Reply all
Reply to author
Forward
0 new messages