Demonstrates how to use Func with tags for dynamic creation of tagged instances.
using Shouldly;
using Pure.DI;
using System.Collections.Immutable;
DI.Setup(nameof(Composition))
.Bind<IDbConnection>("postgres").To<NpgsqlConnection>()
.Bind<IConnectionPool>().To<ConnectionPool>()
// Composition root
.Root<IConnectionPool>("ConnectionPool");
var composition = new Composition();
var pool = composition.ConnectionPool;
// Check that the pool has created 3 connections
pool.Connections.Length.ShouldBe(3);
pool.Connections[0].ShouldBeOfType<NpgsqlConnection>();
interface IDbConnection;
// Specific implementation for PostgreSQL
class NpgsqlConnection : IDbConnection;
interface IConnectionPool
{
ImmutableArray<IDbConnection> Connections { get; }
}
class ConnectionPool([Tag("postgres")] Func<IDbConnection> connectionFactory) : IConnectionPool
{
public ImmutableArray<IDbConnection> Connections { get; } =
[
// Use the factory to create distinct connection instances
connectionFactory(),
connectionFactory(),
connectionFactory()
];
}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
Func with tags allows you to create instances with specific tags dynamically, useful for factory patterns with multiple implementations.
The following partial class will be generated:
partial class Composition
{
public IConnectionPool ConnectionPool
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
Func<IDbConnection> perBlockFunc410 = new Func<IDbConnection>(
[MethodImpl(MethodImplOptions.AggressiveInlining)]
() =>
{
return new NpgsqlConnection();
});
return new ConnectionPool(perBlockFunc410);
}
}
}Class diagram:
---
config:
maxTextSize: 2147483647
maxEdges: 2147483647
class:
hideEmptyMembersBox: true
---
classDiagram
NpgsqlConnection --|> IDbConnection : "postgres"
ConnectionPool --|> IConnectionPool
Composition ..> ConnectionPool : IConnectionPool ConnectionPool
ConnectionPool o-- "PerBlock" FuncᐸIDbConnectionᐳ : "postgres" FuncᐸIDbConnectionᐳ
FuncᐸIDbConnectionᐳ *-- NpgsqlConnection : "postgres" IDbConnection
namespace Pure.DI.UsageTests.BCL.FuncWithTagScenario {
class Composition {
<<partial>>
+IConnectionPool ConnectionPool
}
class ConnectionPool {
<<class>>
+ConnectionPool(FuncᐸIDbConnectionᐳ connectionFactory)
}
class IConnectionPool {
<<interface>>
}
class IDbConnection {
<<interface>>
}
class NpgsqlConnection {
<<class>>
+NpgsqlConnection()
}
}
namespace System {
class FuncᐸIDbConnectionᐳ {
<<delegate>>
}
}