Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Autofac resolve Generic type with constructor parameters at run time

I have a generic class Logger<TProvider> where TProvider : ILogProvider which I'd like to configure dependency injection for with Autofac.

This class also has a constructor:

public Logger(LogType loggerType)

Which is currently used like this:

var logger = new Logger<Log4NetLogProvider>(LogType.CMS);

I was wondering if this could be dependency injected or will that not be possible due to type/constructor parameter required?

I'm aware of the RegisterGeneric method, e.g:

builder.RegisterGeneric(typeof(Logger<>)).AsSelf()

I was wondering how I can tell autofac which TProvider was passed in and also provide the constructor parameter LogType? Or is this not a good candidate for DI?

like image 797
DGibbs Avatar asked Oct 19 '25 13:10

DGibbs


1 Answers

You could try using the WithParameter extension when registering the type

//using named parameter
builder.RegisterGeneric(typeof(Logger<>))
    .AsSelf()
    .WithParameter("loggerType", LogType.CMS);

//OR - using typed parameter
builder.RegisterGeneric(typeof(Logger<>))
   .AsSelf()
   .WithParameter(new TypedParameter(typeof(LogType), LogType.CMS));

Reference Passing Parameters to Register

like image 133
Nkosi Avatar answered Oct 22 '25 03:10

Nkosi