Let’s say we want to create instances after an object’s initialization, using a factory:
public class MyObject: IMyObject {
private readonly IFactory factory;
private readonly List<ISubObject> subObjects = new();
public MyObject(IFactory factory) {
this.factory = factory;
}
public void CreateSubObject() {
subObjects.Add(factory.Create());
}
}
Want to use dependency injection, but don’t want to implement the factory?
var services = new ServiceCollection();
services.AddTransient<IMyObject, MyObject>();
services.AddTransient<ISubObject, SubObject>();
services.AddTypedFactory<IFactory>(); // from Hemel.DependencyInjection.TypedFactory
var provider = services.BuildServiceProvider();
var myObject = provider.GetRequiredService<IMyObject>();
myObject.CreateSubObject();
Want to add parameters to be forwarded to the constructor of the created object?
public class SubObject {
- public SubObject() { /* ... */ }
+ public SubObject(Guid id) { /* ... */ }
}
public interface IFactory {
- ISubObject Create();
+ ISubObject Create(Guid id);
}
var services = new ServiceCollection();
services.AddTransient<IMyObject, MyObject>();
services.AddTransient<ISubObject, SubObject>();
services.AddTypedFactory<IFactory>(); // from Hemel.DependencyInjection.TypedFactory
var provider = services.BuildServiceProvider();
var myObject = provider.GetRequiredService<IMyObject>();
- myObject.CreateSubObject();
+ myObject.CreateSubObject(Guid.NewGuid());
Want to inject services into the instances created with the factory?
public class SubObject {
- public SubObject(Guid id) { /* ... */ }
+ public SubObject(Guid id, ILogger logger) { /* ... */ }
}
var services = new ServiceCollection();
services.AddTransient<IMyObject, MyObject>();
services.AddTransient<ISubObject, SubObject>();
+ services.AddTransient<ILogger, Logger>();
services.AddTypedFactory<IFactory>(); // from Hemel.DependencyInjection.TypedFactory
var provider = services.BuildServiceProvider();
var myObject = provider.GetRequiredService<IMyObject>();
myObject.CreateSubObject();