Which pattern to use for logging? Dependency Injection or Service Locator?

Posted by andlju on Stack Overflow See other posts from Stack Overflow or by andlju
Published on 2010-04-21T11:48:07Z Indexed on 2010/04/21 12:53 UTC
Read the original article Hit count: 202

Consider this scenario. I have some business logic that now and then will be required to write to a log.

interface ILogger
{
    void Log(string stuff);
}

interface IDependency
{
    string GetInfo();
}

class MyBusinessObject
{
    private IDependency _dependency;

    public MyBusinessObject(IDependency dependency)
    {
        _dependency = dependency;
    }

    public string DoSomething(string input)
    {
        // Process input
        var info = _dependency.GetInfo();
        var intermediateResult = PerformInterestingStuff(input, info);

        if (intermediateResult== "SomethingWeNeedToLog")
        {
            // How do I get to the ILogger-interface?
        }

        var result = PerformSomethingElse(intermediateResult);

        return result;
    }
}

How would you get the ILogger interface? I see two main possibilities;

  1. Pass it using Dependency Injection on the constructor.
  2. Get it via a singleton Service Locator.

Which method would you prefer, and why? Or is there an even better pattern?

Update: Note that I don't need to log ALL method calls. I only want to log a few (rare) events that may or may not occur within my method.

© Stack Overflow or respective owner

Related posts about design-patterns

Related posts about dependency-injection