I am using ASP.NET Core, I know that such Logging mechanism is already provided by the framework, but using this to illustrate my problem.
I am using kind of Factory
There are a couple of errors in your approach:
LoggerFactory
type which is a Dependency Inversion Principle violation.ILogger
is the real service that your consumer depends upon. This makes the system harder to test, harder to maintain, and complicates object graph analysis.Instead, your service should look as follows:
public class MyService
{
private ILogger _logger;
public MyService(ILogger logger)
{
_logger = logger;
}
}
This dramatically simplifies all consumers that depend upon ILogger
. This also means that getting the right ILogger
for MyService
becomes a responsibility of the Composition Root, which is the correct place to have this knowledge.
It does mean however that you might need to move away from the built-in DI container of ASP.NET Core to a more feature rich DI library, because the built-in container is not capable of making a context aware registration for ILogger
while having the library auto-wire other constructor dependencies as well.
With the ASP.NET Core DI container, you can only hand-wire your services using a delegate. For instance:
services.AddTransient<MyService>(c => new MyService(
BuildLogger(typeof(MyService).Name),
c.GetRequiredService<ISomeOtherDependency>(),
c.GetRequiredService<IYetAnotherOne>());