To pass a runtime parameter not known at the start of the application, you have to use the factory pattern. You have two options here:
-
factory class (similar to how
IHttpClientFactory
is implemented)public class RootService : IRootService { public RootService(INestedService nested, IOtherService other) { // ... } } public class RootServiceFactory : IRootServiceFactory { // in case you need other dependencies, that can be resolved by DI private readonly IServiceProvider services; public RootServiceFactory(IServiceProvider services) { this.services = services; } public IRootService CreateInstance(string connectionString) { // instantiate service that needs runtime parameter var nestedService = new NestedService(connectionString); // note that in this example, RootService also has a dependency on // IOtherService - ActivatorUtilities.CreateInstance will automagically // resolve that dependency, and any others not explicitly provided, from // the specified IServiceProvider return ActivatorUtilities.CreateInstance<RootService>(services, new object[] { nestedService, }); } }
and inject
IRootServiceFactory
instead of yourIRootService
IRootService rootService = rootServiceFactory.CreateInstance(connectionString);
-
factory method
services.AddTransient<Func<string,INestedService>>((provider) => { return new Func<string,INestedService>( (connectionString) => new NestedService(connectionString) ); });
and inject the factory method into your service instead of
INestedService
public class RootService : IRootService { public INestedService NestedService { get; set; } public RootService(Func<string,INestedService> nestedServiceFactory) { NestedService = nestedServiceFactory("ConnectionStringHere"); } public void DoSomething() { // implement } }
or resolve it per call
public class RootService : IRootService { public Func<string,INestedService> NestedServiceFactory { get; set; } public RootService(Func<string,INestedService> nestedServiceFactory) { NestedServiceFactory = nestedServiceFactory; } public void DoSomething(string connectionString) { var nestedService = nestedServiceFactory(connectionString); // implement } }