I am trying to choose different logger for different type of services. In my following class scenario, i want to use DbAppender for a service which need to log to db and FileAppender for a service which need to log to file.
Here is the class design i have:
public interface ILogger
{
}
public class Logger : ILogger
{
private readonly IAppender _appender;
public Logger(IAppender appender)
{
_appender = appender;
}
}
public interface IAppender
{
}
public interface IRepository
{
}
public class DbAppender : IAppender
{
private IRepository _repository;
public DbAppender(IRepository repository)
{
_repository = repository;
}
}
public class FileAppender : IAppender
{
}
public interface IHelloDbService
{
}
public class HelloServiceWithDbLog : IHelloDbService
{
private readonly ILogger _logger;
public HelloServiceWithDbLog(ILogger logger)
{
_logger = logger;
}
}
public interface IHelloFileService
{
}
public class HelloServiceWithFileLog : IHelloFileService
{
private readonly ILogger _logger;
public HelloServiceWithFileLog(ILogger logger)
{
_logger = logger;
}
}
Now i have to configure structureMap dependency injection accordingly so that for DbService it has to choose logger with db capability and for FileService, it has to choose logger with file capability.
// this has to configure to choose Logger with FileAppender.
x.For<IHelloFileService>().Use<HelloServiceWithFileLog>();
.Ctor<ILogger>().Is<Logger>();
// this has to configure to choose logger passing DbAppender.
x.For<IHelloDbService>().Use<HelloServiceWithDbLog>();
.Ctor<ILogger>().Is<Logger>();