Search code examples
c#autofac

How do I register modules with constructors in autofac?


How do I register modules with constructors in autofac?

I have the following modules:

public class MediatRModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterMediatR(typeof(ApplicationAssemblyMarker).Assembly);
    }
}

public class PersistenceModule : Module
{
    public string ConnectionString { get; }

    public PersistenceModule(string connectionString)
    {
        if (string.IsNullOrWhiteSpace(connectionString))
            throw new ArgumentException("Value cannot be null or whitespace.", nameof(connectionString));

        ConnectionString = connectionString;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<SqlConnectionFactory>()
            .As<ISqlConnectionFactory>()
            .WithParameter("connectionString", ConnectionString)
            .InstancePerLifetimeScope();

        builder
            .RegisterGeneric(typeof(AsyncRepository<>))
            .As(typeof(IAsyncRepository<>))
            .InstancePerLifetimeScope();
    }
}

PersistenceModule it contains a constructor and I can't register all modules via RegisterAssemblyModules in the startup method.

    public void ConfigureContainer(ContainerBuilder containerBuilder)
    {
        containerBuilder
            .RegisterModule(new PersistenceModule(Configuration.GetConnectionString("DefaultConnection")));

        containerBuilder
            .RegisterModule(new DomainModule());

        containerBuilder
            .RegisterModule(new MediatRModule());

        containerBuilder
            .RegisterModule(new CommandsModule());

        containerBuilder
            .RegisterModule(new QueriesModule());
    }

Solution

  • You cannot have dependencies in your Module constructor. But you can provide a value for a parameter by resolving it from the container:

    builder.RegisterType<SqlConnectionFactory>()
        .As<ISqlConnectionFactory>()
        .WithParameter(
            // match parameter
            (info, context) => info.Name == "connectionString",
    
            // resolve value
            (info, context) =>
            {
                var config = context.Resolve<Microsoft.Extensions.Configuration.IConfiguration>();
                return config.GetConnectionString("DefaultConnection");
            }
        );
    

    References