Demonstrates how to create generic dependencies on demand using factory delegates with generic type parameters.
using Shouldly;
using Pure.DI;
using System.Collections.Generic;
DI.Setup(nameof(Composition))
.Bind().To<Worker<TT>>()
.Bind().To<Distributor<TT>>()
// Composition root
.Root<IDistributor<int>>("Root");
var composition = new Composition();
var distributor = composition.Root;
// Check that the distributor has created 2 workers
distributor.Workers.Count.ShouldBe(2);
interface IWorker<T>;
class Worker<T> : IWorker<T>;
interface IDistributor<T>
{
IReadOnlyList<IWorker<T>> Workers { get; }
}
class Distributor<T>(Func<IWorker<T>> workerFactory) : IDistributor<T>
{
public IReadOnlyList<IWorker<T>> Workers { get; } =
[
// Creates the first instance of the worker
workerFactory(),
// Creates the second instance of the worker
workerFactory()
];
}Running this code sample locally
- Make sure you have the .NET SDK 10.0 or later installed
dotnet --list-sdk- Create a net10.0 (or later) console application
dotnet new console -n Sampledotnet add package Pure.DI
dotnet add package Shouldly- Copy the example code into the Program.cs file
You are ready to run the example 🚀
dotnet runNote
Generic on-demand injection provides flexibility for creating instances with different type parameters as needed.
The following partial class will be generated:
partial class Composition
{
public IDistributor<int> Root
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
Func<IWorker<int>> perBlockFunc517 = new Func<IWorker<int>>(
[MethodImpl(MethodImplOptions.AggressiveInlining)]
() =>
{
return new Worker<int>();
});
return new Distributor<int>(perBlockFunc517);
}
}
}Class diagram:
---
config:
maxTextSize: 2147483647
maxEdges: 2147483647
class:
hideEmptyMembersBox: true
---
classDiagram
DistributorᐸInt32ᐳ --|> IDistributorᐸInt32ᐳ
WorkerᐸInt32ᐳ --|> IWorkerᐸInt32ᐳ
Composition ..> DistributorᐸInt32ᐳ : IDistributorᐸInt32ᐳ Root
DistributorᐸInt32ᐳ o-- "PerBlock" FuncᐸIWorkerᐸInt32ᐳᐳ : FuncᐸIWorkerᐸInt32ᐳᐳ
FuncᐸIWorkerᐸInt32ᐳᐳ *-- WorkerᐸInt32ᐳ : IWorkerᐸInt32ᐳ
namespace Pure.DI.UsageTests.Generics.GenericInjectionsOnDemandScenario {
class Composition {
<<partial>>
+IDistributorᐸInt32ᐳ Root
}
class DistributorᐸInt32ᐳ {
<<class>>
+Distributor(FuncᐸIWorkerᐸInt32ᐳᐳ workerFactory)
}
class IDistributorᐸInt32ᐳ {
<<interface>>
}
class IWorkerᐸInt32ᐳ {
<<interface>>
}
class WorkerᐸInt32ᐳ {
<<class>>
+Worker()
}
}
namespace System {
class FuncᐸIWorkerᐸInt32ᐳᐳ {
<<delegate>>
}
}