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 pattern to build the Logger class, since I don't know the type of logging (because it is stored in DB).
The ILogger Contract
Log(string msg)
Then LoggerFactory will return an ILogger after creating a Logger based on param passed from DB:
public class LoggerFactory
{
public static Contracts.ILogger BuildLogger(LogType type)
{
return GetLogger(type);
}
//other code is omitted, GetLogger will return an implementation of the related logger
Now, when I need to use the Logger I have to do it in this way:
public class MyService
{
private ILogger _logger
public MyService()
{
_logger = LoggerFactory.BuildLogger("myType");
}
But, I intend to keep my classes without any instantiation, I need to use Constructor DI in MyService and I need to inject all the dependencies on Startup:
services.AddTransient<Contracts.ILogger, LoggerFactory.BuildLogger("param") > ();
But this will not work this we need to pass a concrete implementation. How to make that work using DI, is there a better approach for implementing that?
LoggerFactory
, instead of aILogger
. This way, you get the LoggerFactory, get the Type from your DB and build your ILogger. If you want to inject the ILogger you would have to know the Type of your ILogger in the moment of the injection. But you may not have this info yet. – Informationservices.AddSingleton<LoggerFactory>();
. Singleton means you'll create a LoggerFactory object only in the first time you need it. After this, you'll use only the same. Then, you use like this:public MyService(LoggerFactory loggerFactory) {....}
– Information