Parece lo mismo pero…

…no lo es. Veo en smart421 lo que el autor considera un uso apropiado del patrón ServiceLocator:

public class Controller : IController
{
    private readonly IServiceLocator _serviceLocator;
    public Controller(IServiceLocator serviceLocator)
    {
        _serviceLocator = serviceLocator;
    }

    public void Execute<TContext>(TContext context)
    {
        var command = _serviceLocator.GetInstance<ICommand<TContext>>();

        if (!command.IsNull())
        {
            command.Execute(context);
        }

        var disposable = command as IDisposable;

        if (disposable != null)
            disposable.Dispose();
    }
}

En mi opinión, esa clase debería ser así:

public class Controller : IController
{
    private readonly ICommandFactory _factory;
    public Controller(ICommandFactory factory)
    {
        _factory = factory;
    }

    public void Execute<TContext>(TContext context)
    {
        var command = _factory.Create<TContext>();

        // La comprobación de IsNull sobra. Si alguien intenta ejecutar
        // un ICommand para un Context que no existe, es que hay un bug.
        command.Execute(context);

        factory.Destroy(command);
    }
}

Aparentemente, lo único que hemos hecho ha sido cambiar una dependencia sobre un IServiceLocator, por una dependencia sobre un ICommandFactory, que además es más limitada y permite hacer menos cosas.

Pues bien, esa es la diferencia, que ICommandFactory permite hacer menos cosas, es decir, tiene una resposabilidad mucho más definida que IServiceLocator. Esto hace que quede mucho más claras cuales son las necesidades de IController, y además evita que podamos “hacer locuras” dentro de él.


4 comentarios en “Parece lo mismo pero…

  1. Pingback: Cuánto daño ha hecho… IValidable (y sucedáneos) « Koalite's blog

  2. Pingback: Cuanto daño ha hecho… CommonServiceLocator « Koalite's blog

  3. Me encanta tu manera de ver las cosas. Yo al trabajar la mayoría de veces en WPF, uso MVVM con un ViewModelLocator. No sé si es buena aproximación. ¿Has trabajado a menudo con WPF+MVVM?
    Gracias :)

  4. Usar un ViewModelLocator que sólo localice ViewModels me parece mejor alternativa que usar directamente un ServiceLocator, aun así creo que lo ideal sería que eso quedase encapsulado en alguna clase de infraestructura en lugar de tener llamadas al ViewModelLocator repartidas por el código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>