Search code examples
c#oopdependency-injectioninterfaceautofac

An error occurred during the activation of a particular registration while using Autofac


This is the way we register the classes using Autofac

builder.Register(c => new FileLogger(ILogger)).As<ILogger>().SingleInstance();

var sizeinkb= Convert.ToInt32(configuration.GetValue<string>("Settings:SizeInKb"));

builder.RegisterType<Broker>().As<IBroker>().WithParameter("size", sizeinkb).SingleInstance();
builder.RegisterType<MainClass>().As<IMainClass>().SingleInstance();

var container = builder.Build();
ContainerFactory.SetContainer(container);

Here is our class

public class MainClass:IMainClass
{
    public MainClass(IBroker broker,ILogger logger)
    {
        _broker = broker,
        _logger = logger
    }
}

Here is the broker class

public class Broker:IBroker 
{
     public Broker(ILogger logger,
             int size)
     {

     }
}

Autofac.Core.DependencyResolutionException HResult=0x80131500 Message=An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = MainClass (ReflectionActivator), Services = [MyProject.IMainClass], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyProject.MainClass' can be invoked with the available services and parameters: Cannot resolve parameter 'MyProject.IBroker broker' of constructor 'Void .ctor(MyProject.IBroker, MyProject.ILogger)'.


Solution

  • Here is another approach where the dependencies can be resolved during the lambda setup

    //...removed for brevity
    
    var sizeinkb = Convert.ToInt32(configuration.GetValue<string>("Settings:SizeInKb"));
    builder.Register(c => new Broker(c.Resolve<ILogger>(), sizeinkb))
        .As<IBroker>().SingleInstance();
    builder.RegisterType<MainClass>().As<IMainClass>().SingleInstance();
    
    var container = builder.Build();
    ContainerFactory.SetContainer(container);